首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 开发语言 > VC/MFC >

C++网络编程 select模型?该如何解决

2012-09-27 
C++网络编程 select模型?C/C++ code//循环接受客户端连接while(true){connectSocket accept(listenSocke

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可能好一点,

热点排行