C++网络编程 select模型?
- C/C++ code
//循环接受客户端连接while(true) { connectSocket = accept(listenSocket, (sockaddr*)&clientAddr, &size); if(connectSocket == SOCKET_ERROR) { continue; } ip = inet_ntoa(::clientAddr.sin_addr); msg.Format("%s connect success!", ip); AfxMessageBox(msg); currentConns[total] = connectSocket; strSocket.Format("%d", connectSocket); if(strcmp(ip, "192.168.170.104")==0) doctorName = "Doctor Sun"; if(strcmp(ip, "192.168.170.105")==0) doctorName = "Doctor Zhang"; bool flag=true; for(int i = 0; i < listCtrl.GetItemCount(); i++) { if(strcmp(ip, listCtrl.GetItemText(i, 2)) == 0) flag = false; } if(flag == true) { ++total; num.Format("%d", total); listCtrl.InsertItem(total-1,""); listCtrl.SetItemText(total-1, 0, num); listCtrl.SetItemText(total-1, 1, doctorName); listCtrl.SetItemText(total-1, 2, ip); } listCtrl.SetItemText(total-1, 3, strSocket); listCtrl.UpdateWindow(); AfxBeginThread(acceptThread,&strc_thread);//该线程用来处理客户端发来的消息 }UINT acceptThread(LPVOID lParam){ StrcForThread* threadInfo = (StrcForThread*)lParam; struct timeval tv = {1, 0}; char recvBuf[1024]={0}; int ret; while(true) { FD_ZERO(&::fds); CString str; for(int i = 0; i < total; i++) { FD_SET(currentConns[i], &fds); } ret = select(0, &fds, NULL, NULL, &tv); if(ret == 0) { continue; } for(int j =0; j < total; j++) { if(FD_ISSET(currentConns[j], &fds)) { ret = recv(currentConns[j], recvBuf, 1024, 0); if (ret == 0 || (ret == SOCKET_ERROR && WSAGetLastError() == WSAECONNRESET)) { closesocket(currentConns[j]); if (j < total-1) { currentConns[j--] = currentConns[--total]; } } } } }[解决办法]
一个问题:currentConns,你没有进行线程间的同步处理,这样就会乱套了。
[解决办法]
怎么进行同步处理···
[解决办法]
你每accept一个连接就创建一个线程?
[解决办法]
1、没有同步
2、recvBuf的大小建议用65536可能好一点,