導航:首頁 > 文檔加密 > csocket編程pdf

csocket編程pdf

發布時間:2022-09-21 09:03:16

㈠ Socket編程的幾種模式

其基本原理是:首先建立一個socket連接,然後對其進行操作,比如,從該socket讀數據。因為網路傳輸是要一定的時間的,即使網路通暢的情況下,接受數據的操作也要花費時間。對於一個簡單的單線程程序,接收數據的過程是無法處理其他操作的。比如一個窗口程序,當你接收數據時,點擊按鈕或關閉窗口操作都不會有效。它的缺點顯而易見,一個線程你只能處理一個 socket,用來教課還行,實際使用效果就不行了。select模型 為了處理多個socket連接,聰明的人們發明了select模型。該模型以集合來管理socket連接,每次去查詢集合中的socket狀態,從而達到處理多連接的能力,其函數原型是int select(int nfds, fd_set FAR * readfds, fd_set FAR * writefds, fd_set FAR * exceptfds, const struct timeval FAR * timeout)。比如我們判斷某個socket是否有數據可讀,我們首先將一個fdread集合置空,然後將socket加入到該集合,調用 select(0,&fdread,NULL,NULL,NULL),之後我們判斷socket是否還在fdread中,如果還在,則說明有數據可讀。數據的讀取和阻塞模型相同,調用recv函數。但是每個集合容量都有一個限值,默認情況下是64個,當然你可以重新定義它的大小,但還是有一個最上限,自己設置也不能超過該值,一般情況下是1024。盡管select模型可以處理多連接,但集合的管理多少讓人感到繁瑣。非同步選擇模型 熟悉windows操作系統的都知道,其窗口處理是基於消息的。人們又發明了一種新的網路模型——WSAAsyncSelect模型,即非同步選擇模型。該模型為每個socket綁定一個消息,當socket上出現事先設置的socket事件時,操作系統就會給應用程序發送這個消息,從而對該 socket事件進行處理,其函數原型是int WSAAsynSelect(SOCKET s, HWND hWnd, unsigned int wMsg, long lEvent)。hWnd指明接收消息的句柄,wMsg指定消息ID,lEvent按位設置感興趣的網路事件,入 WSAAsyncSelect(s,hwnd,WM_SOCKET, FD_CONNECT | FD_READ | FD_CLOSE)。該模型的優點是在系統開銷不大的情況下同時處理許多連接,也不需要什麼集合管理。缺點很明顯,即使你的程序不需要窗口,也要專門為 WSAAsyncSelect模型定義一個窗口。另外,讓單個窗口去處理成千上萬的socket操作事件,很可能成為性能瓶頸。事件選擇模型 與WSAAsynSelect模型類似,人們還發明了WSAEventSelect模型,即事件選擇模型。看名字就可以猜測出來,它是基於事件的。WSAAsynSelect模型在出現感興趣的socket事件時,系統會發一個相應的消息。而WSAEventSelect模型在出現感興趣的socket事件時,系統會將相應WSAEVENT事件設為傳信。可能你現在對sokect事件和普通WSAEVENT事件還不是很清楚。 socket事件是與socket操作相關的一些事件,如FD_READ,FD_WRITE,FD_ACCEPT等。而WSAEVENT事件是傳統的事件,該事件有兩種狀態,傳信(signaled)和未傳信(non-signaled)。所謂傳信,就是事件發生了,未傳信就是還沒有發生。我們每次建立一個連接,都為其綁定一個事件,等到該連接變化時,事件就會變為傳信狀態。那麼,誰去接受這個事件變化呢?我們通過一個 WSAWaitForMultipleEvents(...)函數來等待事件發生,傳入參數中的事件數組中,只有有一個事件發生,該函數就會返回(也可以設置為所有事件發生才返回,在這里沒用),返回值為事件的數組序號,這樣我們就知道了哪個事件發生了,也就是該事件對應的socket有了socket操作事件。該模型比起WSAAsynSelect模型的優勢很明顯,不需要窗口。唯一缺點是,該模型每次只能等待64個事件,這一限制使得在處理多 socket時,有必要組織一個線程池,伸縮性不如後面要講的重疊模型。重疊I/O(Overlapped I/O)模型重疊I/O(Overlapped I/O)模型使應用程序達到更佳的系統性能。重疊模型的基本設計原理是讓應用程序使用重疊數據結構,一次投遞一個或多個Winsock I/O請求。重疊模型到底是什麼東西呢?可以與WSAEventSelect模型做類比(其實不恰當,後面再說),事件選擇模型為每個socket連接綁定了一個事件,而重疊模型為每個socket連接綁定了一個重疊。當連接上發生socket事件時,對應的重疊就會被更新。其實重疊的高明之處在於,它在更新重疊的同時,還把網路數據傳到了實現指定的緩存區中。我們知道,前面的網路模型都要用戶自己通過recv函數來接受數據,這樣就降低了效率。我們打個比方,WSAEventSelect模型就像郵局的包裹通知,用戶收到通知後要自己去郵局取包裹。而重疊模型就像送貨上門,郵遞員發給你通知時,也把包裹放到了你事先指定的倉庫中。 重疊模型又分為事件通知和完成常式兩種模式。在分析這兩種模式之前,我們還是來看看重疊數據結構: typedef struct WSAOVERLAPPED{DWORD Internal; DWORD InternalHigh; DWORD Offset; DWORD OffsetHigh; WSAEVENT hEvent; }WSAOVERLAPPED, FAR * LPWSAOVERLAPPED; 該數據結構中,Internal、InternalHigh、Offset、OffsetHigh都是系統使用的,用戶不用去管,唯一關注的就是 hEvent。如果使用事件通知模式,那麼hEvent就指向相應的事件句柄。如果是完成常式模式,hEvent設為NULL。我們現在來看事件通知模式,首先創建一個事件hEvent,並創建一個重疊結構AcceptOverlapped,並設置AcceptOverlapped.hEvent = hEvent,DataBuf是我們事先設置的數據緩存區。調用 WSARecv(AcceptSocket,&DataBuf,1,&RecvBytes,&Flags,&AcceptOverlapped,NULL),則將AcceptSocket與AcceptOverlapped重疊綁定在了一起。當接收到數據以後,hEvent就會設為傳信,而數據就會放到 DataBuf中。我們再通過WSAWaitForMultipleEvents(...)接收到該事件通知。這里我們要注意,既然是基於事件通知的,那它就有一個事件處理上限,一般為64。 完成常式和事件通知模式的區別在於,當相應的socket事件出現時,系統會調用用戶事先指定的回調函數,而不是設置事件。其實就是將WSARecv的最後一個參數設為函數指針。該回調函數的原型如下: void CALLBACK CompletionROUTINE( DWORD dwError, DWORD cbTransferred, LPWSAOVERLAPPED lpOverlapped, DWORD dwFlags);其中,cbTransferred表示傳輸的位元組數,lpOverlapped是發生socket事件的重疊指針。我們調用 WSARecv(AcceptSocket,&DataBuf,1,&RecvBytes,&Flags,&AcceptOverlapped,WorkerRoutine) 將AcceptSocket與WorkRoutine常式綁定。這里有一點小提示,當我們創建多個socket的連接時,最好把重疊與相應的數據緩存區用一個大的數據結構放到一塊,這樣,我們在常式中通過lpOverlapped指針就可以直接找到相應的數據緩存區。這里要注意,不能將多個重疊使用同一個數據緩存區,這樣在多個重疊都在處理時,就會出現數據混亂。完成埠模型 下面我們來介紹專門用於處理為數眾多socket連接的網路模型——完成埠。因為需要做出大量的工作以便將socket添加到一個完成埠,而其他方法的初始化步驟則省事多了,所以對新手來說,完成埠模型好像過於復雜了。然而,一旦弄明白是怎麼回事,就會發現步驟其實並非那麼復雜。所謂完成埠,實際是Windows採用的一種I/O構造機制,除套接字句柄之外,還可以接受其他東西。使用這種模式之前,首先要創建一個I/O完成埠對象,該函數定義如下: HANDLE CreateIoCompletionPort( HANDLE FileHandle, HANDLE ExistingCompletionPort, DWORD CompletionKey, DWORD NumberOfConcurrentThreads);該函數用於兩個截然不同的目的:1)用於創建一個完成埠對象。2)將一個句柄同完成埠關聯到一起。 通過參數NumberOfConcurrentThreads,我們可以指定同時運行的線程數。理想狀態下,我們希望每個處理器各自負責一個線程的運行,為完成埠提供服務,避免過於頻繁的線程任務切換。對於一個socket連接,我們通過 CreateIoCompletionPort((HANDLE)Accept,CompletionPort, (DWORD)PerHandleData,0)將Accept連接與CompletionPort完成埠綁定到一起,CompetionPort對應的那些線程不斷通過GetQueuedCompletionStatus來查詢與其關聯的socket連接是否有I/O操作完成,如果有,則做相應的數據處理,然後通過WSARecv將該socket連接再次投遞,繼續工作。完成埠在性能和伸縮性方面表現都很好,相關聯的socket連接數目沒有限制。

㈡ c# socket編程

private void button2_Click(object sender, EventArgs e)
if (s.Connected == true)
try
string abc = textBox3.Text;
s.Send(Encoding.ASCII.GetBytes(abc));
MesageBox.Show("向伺服器發送:" + abc);
catcMessageBox.Show("發送失敗");
接收:
System.Timers.Timer aTimer = new System.Timers.Timer();
byte[] res = new byte[1024];
private void Form1_Load(object sender, EventArgs e)
{
Control.CheckForIll
aTimer.Elapsed += new ElapsedEventHandler(socket_rev); //定時事件的方法
aimer.Interval = 100;
private void socket_rev(object sender, EventArgs e)
int receiveLength = s.Receive(res, res.Length, SocketFlags.None);
if (receiveLength > 0)
textBox4.Text = Encoding.ASCII.GetString(res, 0, receiveLength);
string abc = "HaveReceive";
s.Send(Encoding.ASCII.GetBytes(abc));
(2)csocket編程pdf擴展閱讀:C#Socket非同步通訊學習
思路
1、Socket分為面向連接協議(如TCP)和無連接協議(如UDP)
2、Socket通信分為同步操作模式和非同步操作模式,同步模式在建立連接之前/收到消息之前會阻塞當前進程,非同步模式不會阻塞當前進程
綜合以上兩點,考慮到體驗,當然是選擇非同步Socket啦,另外,這里使用的是面向連接的協議,那麼實現思路大致如下:
1、創建Socket對象
2、綁定IP和埠
3、偵聽連接
4、開始一個非同步操作來接收一個接入的連接請求
5、處理接入的請求
6、向客戶端發送消息

㈢ MFC CSocket編程, error C2065: 「IDP_SOCKETS_INIT_FAILED」: 未聲明的標識符。各位大神幫幫忙啊,謝謝了

你在建立MFC工程的時候沒有選用SOCKET選項。。所以他有些資源沒有給你加進去。。。

你在資源文件裡面的Resource.h裡面加一行
#define IDP_SOCKETS_INIT_FAILED 103
應該就可以了(不過我在網上看別人的帖子的時候看到過不是103而是104的我也不知道怎麼回事,103是我自己電腦上自動帶出來的值)

㈣ socket編程到底是什麼

socket 其實就是操作系統提供給程序員操作「網路協議棧」的介面,說人話就是,你能通過socket 的介面,來控制協議找工作,從而實現網路通信,達到跨主機通信。

協議棧的上半部分有兩塊,分別是負責收發數據的 TCP 和 UDP 協議,它們兩會接受應用層的委託執行收發數據的操作。

協議棧的下面一半是用 IP 協議控制網路包收發操作,在互聯網上傳數據時,數據會被切分成一塊塊的網路包,而將網路包發送給對方的操作就是由 IP 負責的。這里需要注意的是,服務端調用 accept 時,連接成功了會返回一個已完成連接的 socket,後續用來傳輸數據。

所以,監聽的 socket 和真正用來傳送數據的 socket,是「兩個」 socket,一個叫作監聽 socket,一個叫作已完成連接 socket。成功連接建立之後,雙方開始通過 read 和 write 函數來讀寫數據,就像往一個文件流裡面寫東西一樣。

㈤ 關於CSocket的三個實際問題!

剛才看錯了MSDN上的解釋是這樣的
CSocket::Create
Call the Create member function after constructing a socket object to create the Windows socket and attach it.

BOOL Create(
UINT nSocketPort = 0,
int nSocketType = SOCK_STREAM,
LPCTSTR lpszSocketAddress = NULL
);

Parameters
nSocketPort
A particular port to be used with the socket, or 0 if you want MFC to select a port.

nSocketType
SOCK_STREAM or SOCK_DGRAM.

lpszSocketAddress
A pointer to a string containing the network address of the connected socket, a dotted number such as "128.56.22.8".

Return Value
Nonzero if the function is successful; otherwise 0, and a specific error code can be retrieved by calling GetLastError.

Remarks
Create then calls Bind to bind the socket to the specified address. The following socket types are supported:

SOCK_STREAM Provides sequenced, reliable, two-way, connection-based byte streams. Uses Transmission Control Protocol (TCP) for the Internet address family.

SOCK_DGRAM Supports datagrams, which are connectionless, unreliable buffers of a fixed (typically small) maximum length. Uses User Datagram Protocol (UDP) for the Internet address family. To use this option, you must not use the socket with a CArchive object.

Note
The Accept member function takes a reference to a new, empty CSocket object as its parameter. You must construct this object before you call Accept. Keep in mind that if this socket object goes out of scope, the connection closes. Do not call Create for this new socket object.

----------------------
sendto
The sendto function sends data to a specific destination.

int sendto(
SOCKET s,
const char* buf,
int len,
int flags,
const struct sockaddr* to,
int tolen
);

Parameters
s
[in] Descriptor identifying a (possibly connected) socket.
buf
[in] Buffer containing the data to be transmitted.
len
[in] Length of the data in buf, in bytes.
flags
[in] Indicator specifying the way in which the call is made.
to
[in] Optional pointer to a sockaddr structure that contains the address of the target socket.
tolen
[in] Size of the address in to, in bytes.
Return Values
If no error occurs, sendto returns the total number of bytes sent, which can be less than the number indicated by len. Otherwise, a value of SOCKET_ERROR is returned, and a specific error code can be retrieved by calling WSAGetLastError.

Error code Meaning
WSANOTINITIALISED A successful WSAStartup call must occur before using this function.
WSAENETDOWN The network subsystem has failed.
WSAEACCES The requested address is a broadcast address, but the appropriate flag was not set. Call setsockopt with the SO_BROADCAST parameter to allow the use of the broadcast address.
WSAEINVAL An unknown flag was specified, or MSG_OOB was specified for a socket with SO_OOBINLINE enabled.
WSAEINTR A blocking Windows Sockets 1.1 call was canceled through WSACancelBlockingCall.
WSAEINPROGRESS A blocking Windows Sockets 1.1 call is in progress, or the service provider is still processing a callback function.
WSAEFAULT The buf or to parameters are not part of the user address space, or the tolen parameter is too small.
WSAENETRESET The connection has been broken e to keep-alive activity detecting a failure while the operation was in progress.
WSAENOBUFS No buffer space is available.
WSAENOTCONN The socket is not connected (connection-oriented sockets only).
WSAENOTSOCK The descriptor is not a socket.
WSAEOPNOTSUPP MSG_OOB was specified, but the socket is not stream-style such as type SOCK_STREAM, OOB data is not supported in the communication domain associated with this socket, or the socket is unidirectional and supports only receive operations.
WSAESHUTDOWN The socket has been shut down; it is not possible to sendto on a socket after shutdown has been invoked with how set to SD_SEND or SD_BOTH.
WSAEWOULDBLOCK The socket is marked as nonblocking and the requested operation would block.
WSAEMSGSIZE The socket is message oriented, and the message is larger than the maximum supported by the underlying transport.
WSAEHOSTUNREACH The remote host cannot be reached from this host at this time.
WSAECONNABORTED The virtual circuit was terminated e to a time-out or other failure. The application should close the socket as it is no longer usable.
WSAECONNRESET The virtual circuit was reset by the remote side executing a hard or abortive close. For UPD sockets, the remote host was unable to deliver a previously sent UDP datagram and responded with a "Port Unreachable" ICMP packet. The application should close the socket as it is no longer usable.
WSAEADDRNOTAVAIL The remote address is not a valid address, for example, ADDR_ANY.
WSAEAFNOSUPPORT Addresses in the specified family cannot be used with this socket.
WSAEDESTADDRREQ A destination address is required.
WSAENETUNREACH The network cannot be reached from this host at this time.
WSAEHOSTUNREACH A socket operation was attempted to an unreachable host.
WSAETIMEDOUT The connection has been dropped, because of a network failure or because the system on the other end went down without notice.

Remarks
The sendto function is used to write outgoing data on a socket. For message-oriented sockets, care must be taken not to exceed the maximum packet size of the underlying subnets, which can be obtained by using getsockopt to retrieve the value of socket option SO_MAX_MSG_SIZE. If the data is too long to pass atomically through the underlying protocol, the error WSAEMSGSIZE is returned and no data is transmitted.

The to parameter can be any valid address in the socket's address family, including a broadcast or any multicast address. To send to a broadcast address, an application must have used setsockopt with SO_BROADCAST enabled. Otherwise, sendto will fail with the error code WSAEACCES. For TCP/IP, an application can send to any multicast address (without becoming a group member).

Note If a socket is opened, a setsockopt call is made, and then a sendto call is made, Windows Sockets performs an implicit bind function call.

If the socket is unbound, unique values are assigned to the local association by the system, and the socket is then marked as bound. An application can use getsockname to determine the local socket name in this case.

The successful completion of a sendto does not indicate that the data was successfully delivered.

The sendto function is normally used on a connectionless socket to send a datagram to a specific peer socket identified by the to parameter. Even if the connectionless socket has been previously connected to a specific address, the to parameter overrides the destination address for that particular datagram only. On a connection-oriented socket, the to and tolen parameters are ignored, making sendto equivalent to send.

這些你可以查看MSDN,上面都有很詳細的解釋的。

㈥ 什麼是socket網路編程

使用socket套接字,利用TCP/IP或者UDP協議,實現幾個機器之間的通信。一般使用C/S結構。
以TCP/IP為例:首先建立一個伺服器,步驟如下:socket()創建一個socket,bind()綁定socket到一個埠,listen()監聽埠,accept()等待客戶端的連接。客戶端程序:socket()創建一個socket,可以綁定也可以不綁定,然後connect()連接到伺服器端。socket又分為阻塞式的和非阻塞式的。阻塞式的就是伺服器端等待連接直到連接上,不然一直掛起。

㈦ CSocket之UDP編程

#include <stdio.h>
#include <Winsock2.h>
#pragma comment(lib,"ws2_32.lib")

void main()
{
WORD wVersionRequested;
WSADATA wsaData;
int err;

wVersionRequested = MAKEWORD( 1, 1);

err = WSAStartup( wVersionRequested, &wsaData );
if ( err != 0 )
{
return;
}

if ( LOBYTE( wsaData.wVersion ) != 1 ||
HIBYTE( wsaData.wVersion ) != 1 )
{
WSACleanup( );
return;
}

SOCKET sersocket=socket(AF_INET,SOCK_DGRAM,0);
SOCKADDR_IN seraddr;
seraddr.sin_addr.S_un.S_addr=htonl(INADDR_ANY);
seraddr.sin_family=AF_INET;
seraddr.sin_port=htons(5000);

bind(sersocket,(SOCKADDR*)&seraddr,sizeof(SOCKADDR));

SOCKADDR clientaddr;
int len=sizeof(SOCKADDR);

char revbuf[100];
char sendbuf[100];

recvfrom(sersocket,revbuf,100,0,(SOCKADDR*)&clientaddr,&len);
printf("%s\n",revbuf);
scanf("%s",&sendbuf);
sendto(sersocket,sendbuf,strlen(sendbuf)+1,0,(SOCKADDR*)&clientaddr,len);

closesocket(sersocket);
WSACleanup();
}

#include <stdio.h>
#include <Winsock2.h>
#pragma comment(lib,"ws2_32.lib")

void main()
{
WORD wVersionRequested;
WSADATA wsaData;
int err;

wVersionRequested = MAKEWORD( 1, 1);

err = WSAStartup( wVersionRequested, &wsaData );
if ( err != 0 )
{
return;
}

if ( LOBYTE( wsaData.wVersion ) != 1 ||
HIBYTE( wsaData.wVersion ) != 1 )
{
WSACleanup( );
return;
}

SOCKET sockclient=socket(AF_INET,SOCK_DGRAM,0);

SOCKADDR_IN clientaddr;
clientaddr.sin_addr.S_un.S_addr=inet_addr("127.0.0.1");
clientaddr.sin_family=AF_INET;
clientaddr.sin_port=htons(5000);

int len=sizeof(SOCKADDR);

char revbuf[100];
char sendbuf[100];
printf("請輸入內容:\n");
while(1)
{

scanf("%s",&sendbuf);
sendto(sockclient,sendbuf,strlen(sendbuf)+1,0,(SOCKADDR*)&clientaddr,len);
recvfrom(sockclient,revbuf,100,0,(SOCKADDR*)&clientaddr,&len);
printf("%s\n",revbuf);

}
closesocket(sockclient);
WSACleanup();
}

大同小異,CSocket只是進行了封裝而已,原理是一樣的,編程要思路靈活才行。

㈧ 學習 c socket 編程的資料和書籍有哪些推薦

推薦以下三本書:
《Unix網路編程1:套接字聯網API》
《圖靈程序設計叢書:TCP/IP網路編程》
《windows socket編程》

重點推薦第一本《UNIX網路編程1》,這本書我覺得是必讀的經典書籍。

㈨ Socket編程

最近也在學 還有一個自己寫的C++聊天程序 有點大 下面是C寫的
sockets(套接字)編程有三種,流式套接字(SOCK_STREAM),數據報套接字 (SOCK_DGRAM),原始套接字(SOCK_RAW);基於TCP的socket編程是採用的流式套接字(SOCK_STREAM)。基於UDP采 用的數據報套接字(SOCK_DGRAM).
1.TCP流式套接字的編程步驟
在使用之前須鏈接庫函數:工程->設置->Link->輸入ws2_32.lib,OK!
伺服器端程序:
1、載入套接字型檔
2、創建套接字(socket)。
3、將套接字綁定到一個本地地址和埠上(bind)。
4、將套接字設為監聽模式,准備接收客戶請求(listen)。
5、等待客戶請求到來;當請求到來後,接受連接請求,返回一個新的對應於此次連接的套接字(accept)。
6、用返回的套接字和客戶端進行通信(send/recv)。
7、返回,等待另一客戶請求。
8、關閉套接字。
客戶端程序:
1、載入套接字型檔
2、創建套接字(socket)。
3、向伺服器發出連接請求(connect)。
4、和伺服器端進行通信(send/recv)。
5、關閉套接字
伺服器端代碼如下:
#include <Winsock2.h>//加裁頭文件
#include <stdio.h>//載入標准輸入輸出頭文件

void main()
{
WORD wVersionRequested;//版本號
WSADATA wsaData;
int err;

wVersionRequested = MAKEWORD( 1, 1 );//1.1版本的套接字

err = WSAStartup( wVersionRequested, &wsaData );
if ( err != 0 ) {
return;
}//載入套接字型檔,加裁失敗則返回

if ( LOBYTE( wsaData.wVersion ) != 1 ||
HIBYTE( wsaData.wVersion ) != 1 ) {
WSACleanup( );
return;
}//如果不是1.1的則退出
SOCKET sockSrv=socket(AF_INET,SOCK_STREAM,0);//創建套接字(socket)。

SOCKADDR_IN addrSrv;
addrSrv.sin_addr.S_un.S_addr=htonl(INADDR_ANY);//轉換Unsigned short為網路位元組序的格式
addrSrv.sin_family=AF_INET;
addrSrv.sin_port=htons(6000);

bind(sockSrv,(SOCKADDR*)&addrSrv,sizeof(SOCKADDR));
//將套接字綁定到一個本地地址和埠上(bind)
listen(sockSrv,5);//將套接字設為監聽模式,准備接收客戶請求(listen)。

SOCKADDR_IN addrClient;//定義地址族
int len=sizeof(SOCKADDR);//初始化這個參數,這個參數必須被初始化

while(1)
{
SOCKET sockConn=accept(sockSrv,(SOCKADDR*)&addrClient,&len);//accept的第三個參數一定要有初始值。
//等待客戶請求到來;當請求到來後,接受連接請求,返回一個新的對應於此次連接的套接字(accept)。
//此時程序在此發生阻塞
char sendBuf[100];
sprintf(sendBuf,"Welcome %s to http://www.sunxin.org",
inet_ntoa(addrClient.sin_addr));
//用返回的套接字和客戶端進行通信(send/recv)。
send(sockConn,sendBuf,strlen(sendBuf)+1,0);
char recvBuf[100];
recv(sockConn,recvBuf,100,0);
printf("%s\n",recvBuf);
closesocket(sockConn);//關閉套接字。等待另一個用戶請求
}
}
客戶端代碼如下:
#include <Winsock2.h>
#include <stdio.h>

void main()
{
WORD wVersionRequested;
WSADATA wsaData;
int err;

wVersionRequested = MAKEWORD( 1, 1 );

err = WSAStartup( wVersionRequested, &wsaData );載入套接字型檔
if ( err != 0 ) {
return;
}

if ( LOBYTE( wsaData.wVersion ) != 1 ||
HIBYTE( wsaData.wVersion ) != 1 ) {
WSACleanup( );
return;
}
SOCKET sockClient=socket(AF_INET,SOCK_STREAM,0);創建套接字(socket)。

SOCKADDR_IN addrSrv;
addrSrv.sin_addr.S_un.S_addr=inet_addr("127.0.0.1");
addrSrv.sin_family=AF_INET;
addrSrv.sin_port=htons(6000);
connect(sockClient,(SOCKADDR*)&addrSrv,sizeof(SOCKADDR));向伺服器發出連接請求(connect)。

char recvBuf[100];和伺服器端進行通信(send/recv)。
recv(sockClient,recvBuf,100,0);
printf("%s\n",recvBuf);
send(sockClient,"This is lisi",strlen("This is lisi")+1,0);

closesocket(sockClient);關閉套接字。
WSACleanup();//必須調用這個函數清除參數
}

閱讀全文

與csocket編程pdf相關的資料

熱點內容
android平滑滾動效果 瀏覽:839
什麼是編譯器指令 瀏覽:219
微控制器邏輯命令使用什麼匯流排 瀏覽:885
程序員在學校里是學什麼的 瀏覽:601
oraclejava數據類型 瀏覽:890
程序員考注冊會計師 瀏覽:957
怎麼使用access的命令按鈕 瀏覽:899
有點錢app在哪裡下載 瀏覽:832
博途v15解壓後無法安裝 瀏覽:205
什麼是根伺服器主機 瀏覽:438
安卓手游怎麼申請退款 瀏覽:555
安卓系統如何分享網頁 瀏覽:278
ad如何編譯pcb工程 瀏覽:414
除了滴滴app哪裡還能用滴滴 瀏覽:399
截圖怎麼保存文件夾然後壓縮 瀏覽:8
幻影伺服器怎麼樣 瀏覽:28
具體哪些廣東公司招程序員 瀏覽:870
嵌入式編譯器教程 瀏覽:306
ssl數據加密傳輸 瀏覽:86
51單片機定時器方式2 瀏覽:332