winsocket有兴趣的 ,挑战一下啊
基于select模式的 一个工作线程主线程在接受客户端的连接,工作线程在处理数据能否在这基础上实现一个功能:有客户端连接后,就接受数据,然后 写到磁盘中,注:保存磁盘有讲究, 文件名必须是1001,1002,1003,以此类推。 CreateThread(NULL, 0, WorkerThread, NULL, 0, &dwThreadId); while (TRUE) { // Accept a connection sClient = accept(sListen, (struct sockaddr *)&client, &iaddrSize); printf("Accepted client:%s:%d\n", inet_ntoa(client.sin_addr), ntohs(client.sin_port)); // Add socket to g_CliSocketArr g_CliSocketArr[g_iTotalConn++] = sClient; } DWORD WINAPI WorkerThread(LPVOID lpParam) { int i; fd_set fdread; int ret; struct timeval tv = {1, 0}; char szMessage[MSGSIZE]; while (TRUE) { FD_ZERO(&fdread); for (i = 0; i < g_iTotalConn; i++) { FD_SET(g_CliSocketArr[i], &fdread); } // We only care read event ret = select(0, &fdread, NULL, NULL, &tv); if (ret == 0) { // Time expired continue; } for (i = 0; i < g_iTotalConn; i++) { if (FD_ISSET(g_CliSocketArr, &fdread)) { // A read event happened on g_CliSocketArr ret = recv(g_CliSocketArr, szMessage, MSGSIZE, 0); if (ret == 0 || (ret == SOCKET_ERROR && WSAGetLastError() == WSAECONNRESET)) { // Client socket closed printf("Client socket %d closed.\n", g_CliSocketArr); closesocket(g_CliSocketArr); if (i < g_iTotalConn - 1) { g_CliSocketArr[i--] = g_CliSocketArr[--g_iTotalConn]; } } else { // We received a message from client szMessage[ret] = '\0'; send(g_CliSocketArr[i], szMessage, strlen(szMessage), 0); } } //if }//for }//while return 0; }