Chinaunix

标题: socket accept 的问题 [打印本页]

作者: ar996    时间: 2011-12-17 21:20
标题: socket accept 的问题
服务器端建立侦听 ,当多个客户端连接时 都很正常,当一个客户端 开启多个线程时(建立不同的socket),
发现服务器端accept 返回的socket 都是一样的,这样客户端接收数据就不正常了 。经常recv不到东西 。如果客户端开启多线程时 每个线程都延时一段时间 ,accept返回的socket 有时候就不一样了 ,还是有相同的时候 。
作者: fangzz17    时间: 2011-12-18 16:25
把代码拉出来溜溜
作者: crazyhadoop    时间: 2011-12-18 16:49
如果是每个线程处理一个连接应该不会有问题吧。若是多个竞争一个。。
作者: ar996    时间: 2011-12-19 11:49
服务器端的侦听线程
DWORD WINAPI Fsocket::ListenThreadFunc(LPVOID Para)
{
        SOCKET hSocket,hClientSocket;
        struct sockaddr_in server,addr;
        int addrlen = sizeof(addr);
        char szIP[15+1];
        int nErr;
        CString str;

        //设置侦听线程运行标志
        m_bListenRun = true;

        //创建 Listen SOCKET
        if((hSocket = socket(AF_INET,SOCK_STREAM,0)) == INVALID_SOCKET)
        {
                nErr = WSAGetLastError();
                WriteTraceLog(TRACE_COMERR,nErr,"创建侦听通讯端口错误");

                //设置侦听线程运行标志
                m_bListenRun = false;

                return -1;
        }

        //fill in server structure
        ZeroMemory((char*)&server,sizeof(server));
        server.sin_family = AF_INET;
        if (strlen(theApp.m_sServer) > 0 && strcmp(theApp.m_sServer,"127.0.0.1") != 0)
        {
                unsigned long ip_addr = inet_addr(theApp.m_sServer);
                CopyMemory((char *)&(server.sin_addr),(char *)&ip_addr,sizeof(server.sin_addr));
        }
        else server.sin_addr.s_addr = htonl(INADDR_ANY);
        server.sin_port = htons(theApp.m_nPort);

        //bind address to socket
        if(bind(hSocket,(struct sockaddr *)&server,sizeof(server)) == SOCKET_ERROR)
        {
                nErr = WSAGetLastError();
                WriteTraceLog(TRACE_COMERR,nErr,"绑定侦听IP和通讯端口错误");

                closesocket(hSocket);

                //设置侦听线程运行标志
                m_bListenRun = false;

                str.Format("绑定侦听IP[%s]和通讯端口[%d]错误\n\n可能的原因:\n1、IP地址不存在\n2、端口被占用\n3、其它用户已启动本程序",theApp.m_sServer,theApp.m_nPort);
                AfxMessageBox(str);
//                AfxMessageBox("绑定侦听IP和通讯端口错误\n\n该IP不存在或该端口可能被占用!");

                return -1;
        }

        //侦听通讯端口
        if (listen(hSocket,50) == SOCKET_ERROR)
        {
                nErr = WSAGetLastError();
                WriteTraceLog(TRACE_COMERR,nErr,"准备侦听通讯端口错误");

                closesocket(hSocket);

                //设置侦听线程运行标志
                m_bListenRun = false;

                return -2;
        }

        int nError;
        fd_set fds;

        //设置检测状态,等待时间为1秒
        struct timeval timeout;
        timeout.tv_sec = 0;
        timeout.tv_usec= 10;

        while(WaitForSingleObject(m_hListenExitEvent,5) != WAIT_OBJECT_0)
        {
                //检测侦听SOCKET的状态
                FD_ZERO(&fds);
                FD_SET(hSocket,&fds);
                nError=select((int)hSocket+1,&fds,NULL,NULL,&timeout);

                //发生错误
                if (nError == SOCKET_ERROR)
                {
                        int nErr;

                        nErr = WSAGetLastError();
                        WriteTraceLog(TRACE_COMERR,nErr,"侦听通讯端口错误");

                        break;
                }

                //无数据
                if (nError == 0) continue;

                //接受连接
               
                hClientSocket = accept(hSocket,(struct sockaddr *)&addr,&addrlen);
                if (hClientSocket == INVALID_SOCKET) continue;

                strcpy_s(szIP,inet_ntoa(addr.sin_addr));
               

                if (strcmp(theApp.m_szUsePool,"Y") != 0)
                {
                        //创建通讯线程
                        if (!CreateClientThread(hClientSocket,szIP))
                        {
                                //创建失败
                                closesocket(hClientSocket);
                        }
                }
                else
                {
                        int nTask;

                        //获取连接池资源
                        nTask = CTaskPool::GetClientTask(TIME_WAITSLOTRC);

                        if (nTask < 0)
                        {
                                //创建失败
                                closesocket(hClientSocket);

                                //
                                str.Format("侦听获得连接池错误,IP:%s",szIP);
                                WriteTraceLog(TRACE_COMERR,0,(char *)((LPCTSTR)str));
                        }
                        else
                        {
                                //向任务池中写入任务
                                CTaskPool::WriteClientTask(nTask,hClientSocket,szIP);
                        }
                }
        }

        closesocket(hSocket);

        //设置侦听线程运行标志
        m_bListenRun = false;

        return 0;
}
作者: slata    时间: 2013-03-20 20:19
tcp        0      0 192.168.8.198:6183          192.168.11.46:52598         CLOSE_WAIT  
tcp        0      0 192.168.8.198:6183          192.168.11.46:52085         CLOSE_WAIT  
tcp        0      0 192.168.8.198:6183          192.168.11.46:51829         CLOSE_WAIT  
tcp        0      0 192.168.8.198:6183          192.168.11.46:52597         CLOSE_WAIT  
tcp        0      0 192.168.8.198:6183          192.168.11.46:52341         CLOSE_WAIT  
tcp        0      0 192.168.8.198:6183          192.168.11.46:51828         CLOSE_WAIT  
tcp        0      0 192.168.8.198:6183          192.168.11.46:52084         CLOSE_WAIT  
tcp     1025      0 192.168.8.198:6183          192.168.11.46:52091         CLOSE_WAIT  
tcp        0      0 192.168.8.198:6183          192.168.11.46:51835         CLOSE_WAIT  
tcp        0      0 192.168.8.198:6183          192.168.11.46:52346         CLOSE_WAIT  
tcp        0      0 192.168.8.198:6183          192.168.11.46:51834         CLOSE_WAIT  
tcp     1025      0 192.168.8.198:6183          192.168.11.46:52090         CLOSE_WAIT  
tcp        0      0 192.168.8.198:6183          192.168.11.46:51833         CLOSE_WAIT  
tcp        0      0 192.168.8.198:6183          192.168.11.46:51832         CLOSE_WAIT  
tcp        0      0 192.168.8.198:6183          192.168.11.46:52088         CLOSE_WAIT  
tcp     1025      0 192.168.8.198:6183          192.168.11.46:52095         CLOSE_WAIT  
tcp        0      0 192.168.8.198:6183          192.168.11.46:51839         CLOSE_WAIT  
tcp        0      0 192.168.8.198:6183          192.168.11.46:51838         CLOSE_WAIT  
tcp     1025      0 192.168.8.198:6183          192.168.11.46:52094         CLOSE_WAIT  
tcp     1025      0 192.168.8.198:6183          192.168.11.46:52093         CLOSE_WAIT  
tcp        0      0 192.168.8.198:6183          192.168.11.46:51837         CLOSE_WAIT  
tcp        0      0 192.168.8.198:6183          192.168.11.46:51836         CLOSE_WAIT  
tcp     1025      0 192.168.8.198:6183          192.168.11.46:52348         CLOSE_WAIT  
tcp        0      0 192.168.8.198:6183          192.168.11.46:52067         CLOSE_WAIT  
tcp        0      0 192.168.8.198:6183          192.168.11.46:51811         CLOSE_WAIT  
tcp        0      0 192.168.8.198:6183          192.168.11.46:51810         CLOSE_WAIT  
tcp        0      0 192.168.8.198:6183          192.168.11.46:52066         CLOSE_WAIT  
tcp        0      0 192.168.8.198:6183          192.168.11.46:52065         CLOSE_WAIT  
tcp        0      0 192.168.8.198:6183          192.168.11.46:51809         CLOSE_WAIT  
tcp        0      0 192.168.8.198:6183          192.168.11.46:52576         CLOSE_WAIT  
tcp        0      0 192.168.8.198:6183          192.168.11.46:51808         CLOSE_WAIT  
tcp     1025      0 192.168.8.198:6183          192.168.11.46:52064         CLOSE_WAIT  
tcp        0      0 192.168.8.198:6183          192.168.11.46:52071         CLOSE_WAIT  
tcp        0      0 192.168.8.198:6183          192.168.11.46:51815         CLOSE_WAIT  
tcp        0      0 192.168.8.198:6183          192.168.11.46:51814         CLOSE_WAIT  

作者: yulihua49    时间: 2013-03-21 09:57
ar996 发表于 2011-12-17 21:20
服务器端建立侦听 ,当多个客户端连接时 都很正常,当一个客户端 开启多个线程时(建立不同的socket),
发 ...

有这个问题,每创建一个线程需要usleep(5000);




欢迎光临 Chinaunix (http://bbs.chinaunix.net/) Powered by Discuz! X3.2