本代码用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();
- }