【TCP】使用Select-服务端
- //
- // CopyRight(c) 2009, YOYO, All Rights Reserved.
- // Author: LIN YiQian
- // Created: 2009/09/17
- // Describe: TCP Select 服务端
- //
- #include <WinSock2.h>
- #include <iostream>
- #include <set>
- #pragma comment(lib, "ws2_32.lib")
- typedef std::set<SOCKET> SOCKET_SET;
- void main(void)
- {
- WSADATA wsaData;
- if (WSAStartup( MAKEWORD(2, 2), &wsaData) != 0)
- {
- return;
- }
- if (LOBYTE(wsaData.wVersion) != 2 || HIBYTE(wsaData.wVersion) != 2)
- {
- WSACleanup();
- return;
- }
- SOCKET socketServer = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);
- SOCKADDR_IN addrServer;
- addrServer.sin_addr.S_un.S_addr = htonl(INADDR_ANY);
- addrServer.sin_port = htons(9989);
- addrServer.sin_family = AF_INET;
- bind(socketServer, (SOCKADDR*)&addrServer, sizeof(SOCKADDR));
- listen(socketServer, 4);
- SOCKET socketClient;
- struct fd_set fdRead;
- int nSize;
- SOCKET_SET setSockets;
- char szMsg[128];
- ZeroMemory(szMsg, sizeof(szMsg));
- int nBlockMilli = 0;
- struct timeval timeout;
- timeout.tv_sec = 0;
- timeout.tv_usec = 100;
- while (true)
- {
- FD_ZERO(&fdRead); // 初始化fd_set
- FD_SET(socketServer, &fdRead); // 分配套接字句柄到对应的fd_set
- select(FD_SETSIZE, &fdRead, NULL, NULL, &timeout);
- nSize = sizeof(addrServer);
- if (FD_ISSET(socketServer, &fdRead)) // 如果套接字句柄还在fd_set里,说明
- // 客户端已有connect的请求,马上就可以accept
- {
- socketClient = accept(socketServer, (SOCKADDR*)&addrServer, &nSize);
- setSockets.insert(socketClient);
- }
- FD_ZERO(&fdRead);
- for (SOCKET_SET::iterator iterSet = setSockets.begin(); iterSet != setSockets.end(); iterSet++)
- {
- FD_SET(*iterSet, &fdRead);
- }
- select(FD_SETSIZE, &fdRead, NULL, NULL, &timeout);
- for (SOCKET_SET::iterator iterSet = setSockets.begin(); iterSet != setSockets.end(); iterSet++)
- {
- if (FD_ISSET(*iterSet, &fdRead))
- {
- recv(*iterSet, szMsg, strlen(szMsg) + 1, 0);
- std::cout << szMsg << std::endl;
- }
- }
- }
- for (SOCKET_SET::iterator iterSet = setSockets.begin(); iterSet != setSockets.end(); iterSet++)
- {
- closesocket(*iterSet);
- }
- closesocket(socketServer);
- WSACleanup();
- return;
- }
【TCP】使用Select-客户端
- //
- // CopyRight(c) 2009, YOYO, All Rights Reserved.
- // Author: LIN YiQian
- // Created: 2009/09/17
- // Describe: TCP Select 客户端
- //
- #include <WinSock2.h>
- #include <iostream>
- #include <ctime>
- #pragma comment(lib, "ws2_32.lib")
- DWORD WINAPI ClientSocketThread(LPVOID lpParameter);
- void main(void)
- {
- WSADATA wsaData;
- if (WSAStartup(MAKEWORD(2, 2), &wsaData) != 0)
- {
- return;
- }
- if (LOBYTE(wsaData.wVersion) != 2 || HIBYTE(wsaData.wVersion) != 2)
- {
- WSACleanup();
- return;
- }
- SYSTEM_INFO systemInfo;
- GetSystemInfo(&systemInfo);
- // 开启CPU个数2倍的线程
- for (int i = 0; i < (systemInfo.dwNumberOfProcessors * 2); ++i)
- {
- HANDLE handle = CreateThread(NULL, 0, ClientSocketThread, NULL, 0, NULL);
- if (handle == NULL)
- {
- std::cout << "创建Client线程失败!" << std::endl;
- }
- CloseHandle(handle);
- }
- while (true)
- {
- }
- WSACleanup();
- return;
- }
- DWORD WINAPI ClientSocketThread(LPVOID lpParameter)
- {
- SOCKET socketClient = socket(AF_INET, SOCK_STREAM, 0);
- SOCKADDR_IN addrServer;
- addrServer.sin_addr.S_un.S_addr = inet_addr("127.0.0.1");
- addrServer.sin_port = htons(9989);
- addrServer.sin_family = AF_INET;
- connect(socketClient, (SOCKADDR*)&addrServer, sizeof(SOCKADDR));
- char szMsg[100];
- srand(time(NULL));
- while (true)
- {
- sprintf(szMsg, "Socket %d connect../n", socketClient);
- send(socketClient, szMsg, strlen(szMsg) + 1, 0);
- Sleep(100);
- }
- closesocket(socketClient);
- }