1 #include <iostream>
2 #include <WinSock2.h>
3
4 using namespace std;
5
6 #pragma comment(lib, "ws2_32")
7
8 int main(int argc, char **argv)
9 {
10 WSADATA wsaData;
11 WSAStartup(WINSOCK_VERSION, &wsaData);
12
13 USHORT uPort = 4567;
14 SOCKET sListen = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);
15 if (INVALID_SOCKET == sListen)
16 {
17 cout << "socket error : " << GetLastError() << endl;
18 return 0;
19 }
20
21 SOCKADDR_IN sin;
22 sin.sin_family = AF_INET;
23 sin.sin_port = htons(uPort);
24 sin.sin_addr.S_un.S_addr = INADDR_ANY;
25
26 if (SOCKET_ERROR == bind(sListen, (PSOCKADDR)&sin, sizeof(sin)))
27 {
28 cout << "Bind error : " << WSAGetLastError() << endl;
29 closesocket(sListen);
30 WSACleanup();
31 return 0;
32 }
33
34 if (SOCKET_ERROR == listen(sListen, 5))
35 {
36 cout << "listen error : " << WSAGetLastError() << endl;
37 closesocket(sListen);
38 WSACleanup();
39 return 0;
40 }
41
42 fd_set fdSocket;
43 FD_ZERO(&fdSocket);
44 FD_SET(sListen, &fdSocket);
45
46 while (TRUE)
47 {
48 fd_set fdRead = fdSocket;
49 int iRet = select(0, &fdRead, NULL, NULL, NULL);
50 if (iRet > 0)
51 {
52 for (size_t i = 0; i < fdSocket.fd_count; i++)
53 {
54 if (FD_ISSET(fdSocket.fd_array[i], &fdRead))
55 {
56 if (fdSocket.fd_array[i] == sListen)
57 {
58 if (fdSocket.fd_count < FD_SETSIZE)
59 {
60 SOCKADDR_IN addrRemote;
61 int iAddrLen = sizeof(addrRemote);
62 SOCKET sNew = accept(sListen, (PSOCKADDR)&addrRemote, &iAddrLen);
63 FD_SET(sNew, &fdSocket);
64 cout << "接收到连接(" << inet_ntoa(addrRemote.sin_addr) << ")" << endl;
65 }
66 else
67 {
68 cout << "连接太多!" << endl;
69 continue;
70 }
71 }
72 else
73 {
74 char szText[256];
75 int iRecv = recv(fdSocket.fd_array[i], szText, strlen(szText), 0);
76 if (iRecv > 0)
77 {
78 szText[iRecv] = '\0';
79 cout << "接收到数据:" << szText << endl;
80 }
81 else
82 {
83 closesocket(fdSocket.fd_array[i]);
84 FD_CLR(fdSocket.fd_array[i], &fdSocket);
85 }
86 }
87 }
88 }
89 }
90 else
91 {
92 cout << "select error : " << WSAGetLastError() << endl;
93 closesocket(sListen);
94 WSACleanup();
95 break;
96 }
97 }
98
99 shutdown(sListen, SD_RECEIVE);
100 WSACleanup();
101
102 return 0;
103 }