原文转载自:https://www.cnblogs.com/qiyueliuguang/archive/2013/12/31/3498705.html
#include <iostream>
#include <WinSock2.h>
using namespace std;
#pragma comment(lib, "ws2_32")
int main(int argc, char **argv)
{
WSADATA wsaData;
WSAStartup(WINSOCK_VERSION, &wsaData);
USHORT uPort = 4567;
SOCKET sListen = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);
if (INVALID_SOCKET == sListen)
{
cout << "socket error : " << GetLastError() << endl;
return 0;
}
SOCKADDR_IN sin;
sin.sin_family = AF_INET;
sin.sin_port = htons(uPort);
sin.sin_addr.S_un.S_addr = INADDR_ANY;
if (SOCKET_ERROR == bind(sListen, (PSOCKADDR)&sin, sizeof(sin)))
{
cout << "Bind error : " << WSAGetLastError() << endl;
closesocket(sListen);
WSACleanup();
return 0;
}
if (SOCKET_ERROR == listen(sListen, 5))
{
cout << "listen error : " << WSAGetLastError() << endl;
closesocket(sListen);
WSACleanup();
return 0;
}
fd_set fdSocket;
FD_ZERO(&fdSocket);
FD_SET(sListen, &fdSocket);
while (TRUE)
{
fd_set fdRead = fdSocket;
int iRet = select(0, &fdRead, NULL, NULL, NULL);
if (iRet > 0)
{
for (size_t i = 0; i < fdSocket.fd_count; i++)
{
if (FD_ISSET(fdSocket.fd_array[i], &fdRead))
{
if (fdSocket.fd_array[i] == sListen)
{
if (fdSocket.fd_count < FD_SETSIZE)
{
SOCKADDR_IN addrRemote;
int iAddrLen = sizeof(addrRemote);
SOCKET sNew = accept(sListen, (PSOCKADDR)&addrRemote, &iAddrLen);
FD_SET(sNew, &fdSocket);
cout << "接收到连接(" << inet_ntoa(addrRemote.sin_addr) << ")" << endl;
}
else
{
cout << "连接太多!" << endl;
continue;
}
}
else
{
char szText[256];
int iRecv = recv(fdSocket.fd_array[i], szText, strlen(szText), 0);
if (iRecv > 0)
{
szText[iRecv] = '\0';
cout << "接收到数据:" << szText << endl;
}
else
{
closesocket(fdSocket.fd_array[i]);
FD_CLR(fdSocket.fd_array[i], &fdSocket);
}
}
}
}
}
else
{
cout << "select error : " << WSAGetLastError() << endl;
closesocket(sListen);
WSACleanup();
break;
}
}
shutdown(sListen, SD_RECEIVE);
WSACleanup();
return 0;
}