如有转发,请注明原文链接。 发表日期:2010-11-28 21:13:33 本代码用VS2008编写: //先打开服务器端,服务器在执行完recv()后堵塞,等待接收数据... #include <winsock2.h> #include <stdio.h> #pragma comment(lib,"WS2_32.LIB") void main() { WSADATA wsaData; SOCKET ListeningSocket; SOCKET NewConnection; SOCKADDR_IN ServerAddr; SOCKADDR_IN ClientAddr; char RecviverBuf[1024]; int BufLength = 1024; int Port = 8060; int Ret; //初始化Winsock版本2.2 if((Ret =WSAStartup(MAKEWORD(2,2),&wsaData)) != 0) { printf("ERROR:WSAStartup failed with %d/n",Ret); return; } //创建一个新的套接字来监听客户机链接 if(INVALID_SOCKET == (ListeningSocket = socket(AF_INET,SOCK_STREAM,IPPROTO_TCP))) { printf("ERROR:SOCKET failed with %d/n",WSAGetLastError()); WSACleanup(); return; } //建立一个SOCKADDR_IN结构,这个结构告知bind我们想得到的8060端口监听所有接口上的连接 ServerAddr.sin_family = AF_INET; ServerAddr.sin_port = htons(Port); ServerAddr.sin_addr.s_addr = htonl(INADDR_ANY); //使用bind将这个地址信息和套接字关联起来 if(SOCKET_ERROR == bind(ListeningSocket,(SOCKADDR *)&ServerAddr,sizeof(ServerAddr))) { printf("ERROR:bind failed with %d/n",WSAGetLastError()); closesocket(ListeningSocket); WSACleanup(); return; } //监听客户机连接。这里使用5个backlog,许多应用程序一般都使用这个数量 if(SOCKET_ERROR == listen(ListeningSocket,5)) { printf("ERROR:listen failed with %d/n",WSAGetLastError()); closesocket(ListeningSocket); WSACleanup(); return; } //连接到达时,接受一个新的连接 int ClientAddrLen = sizeof(ClientAddr); if(INVALID_SOCKET == (NewConnection = accept(ListeningSocket,(SOCKADDR *)&ClientAddr,&ClientAddrLen))) { printf("ERROR:accept failed with %d/n",WSAGetLastError()); closesocket(ListeningSocket); WSACleanup(); return; } printf("accept succeed!/n"); //接受数据 //注意recv()/send()和recvfrom()/sendto()的区别:使用recv()/send()需要先建立连接,而recvfrom()/sendto()不需要先建立连接... if(SOCKET_ERROR == recv(NewConnection,RecviverBuf,BufLength,0)) { printf("ERROR:recv failed with %d/n",WSAGetLastError()); closesocket(ListeningSocket); WSACleanup(); return; } printf("recv succeed!/n"); //显示接收到的数据 for(int id=0; id<5 ;++id) printf("%c",RecviverBuf[id]); //完成接受新连接后,应该用closesocket API关闭这些套接字 closesocket(NewConnection); closesocket(ListeningSocket); //应用程序完成对连接的处理后,调用WSACleanup WSACleanup(); }