#include <WINSOCK2.H> #include <iostream> using namespace std; #pragma comment (lib, "ws2_32.lib") ///////////////////////////////////////////// #define IP "127.0.0.1" #define PORT 10000 #define CONNECT_TIP "You are connected!" #define BACK_LOG 10 ///////////////////////////////////////////// bool InitSerSocket(SOCKET &serSock); int main() { SOCKET serSock; if (!InitSerSocket(serSock)) { return -1; } fd_set fdSockSet; FD_ZERO(&fdSockSet); FD_SET(serSock, &fdSockSet); // 客户端地址信息 sockaddr_in addrClient; int iAddrCltLen = sizeof(addrClient); // 收发信息缓存 char szBuffer[1024] = ""; int iTranslate = 0; while (1) { fd_set fdBackupSet = fdSockSet; int ret = select(serSock+1, &fdBackupSet, NULL, NULL, NULL); if (-1 == ret) { cout << "select 发生错误:" << WSAGetLastError() << endl; closesocket(serSock); WSACleanup(); system("pause"); return -1; } for (int i=0; i<fdSockSet.fd_count; i++) { // 是否有操作 if (FD_ISSET(fdSockSet.fd_array[i], &fdBackupSet)) { // 可操作socket是服务器,则接受连接 if (fdSockSet.fd_array[i] == serSock) { memset(&addrClient, 0, sizeof(sockaddr_in)); SOCKET sockAccept = accept(serSock, (SOCKADDR*)&addrClient, &iAddrCltLen); if (INVALID_SOCKET != sockAccept) { FD_SET(sockAccept, &fdSockSet); cout << "socket " << sockAccept << " 已连接" << endl; // 通知客户端已连接 send(sockAccept, CONNECT_TIP, sizeof(CONNECT_TIP), 0); } } // client else { memset(szBuffer, 0, sizeof(szBuffer)); iTranslate = recv(fdSockSet.fd_array[i], szBuffer, sizeof(szBuffer), 0); // 客户端正常关闭 if (0 == iTranslate) { cout << "客户端: " << fdSockSet.fd_array[i] << " 已关闭" << endl; closesocket(fdSockSet.fd_array[i]); FD_CLR(fdSockSet.fd_array[i], &fdSockSet); i--; } // 不正常中断连接 if (SOCKET_ERROR == iTranslate) { cout << "连接中断:" << WSAGetLastError() << endl; closesocket(serSock); FD_CLR(fdSockSet.fd_array[i], &fdSockSet); i--; } // 正常通信 if (0 < iTranslate) { cout << "recv: " << szBuffer << endl; } } } } } closesocket(serSock); WSACleanup(); system("pause"); return 0; } bool InitSerSocket(SOCKET &serSock) { // 启动WinsockDLL库 WSAData wsaData; if (0 != WSAStartup(MAKEWORD(2, 2), &wsaData)) { cout << "WinsockDLL 加载失败" << endl; return false; } serSock = socket(AF_INET, SOCK_STREAM, 0); if (INVALID_SOCKET == serSock) { cout << "服务器套接字创建失败:" << WSAGetLastError() << endl; closesocket(serSock); WSACleanup(); system("pause"); return false; } // 服务器协议地址簇 sockaddr_in addrServer; addrServer.sin_addr.s_addr = ADDR_ANY; addrServer.sin_family = AF_INET; addrServer.sin_port = htons(PORT); memset(&addrServer.sin_zero, 0, sizeof(addrServer.sin_zero)); // 绑定 if (-1 == bind(serSock, (SOCKADDR*)&addrServer, sizeof(sockaddr_in))) { cout << "绑定失败:" << WSAGetLastError() << endl; closesocket(serSock); WSACleanup(); system("pause"); return false; } // 监听 if (-1 == listen(serSock, BACK_LOG)) { cout << "监听失败:" << WSAGetLastError() << endl; closesocket(serSock); WSACleanup(); system("pause"); return false; } cout << "正在监听..." << endl; return true; }