免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
查看: 7934 | 回复: 5
打印 上一主题 下一主题

socket accept 的问题 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2011-12-17 21:20 |只看该作者 |倒序浏览
服务器端建立侦听 ,当多个客户端连接时 都很正常,当一个客户端 开启多个线程时(建立不同的socket),
发现服务器端accept 返回的socket 都是一样的,这样客户端接收数据就不正常了 。经常recv不到东西 。如果客户端开启多线程时 每个线程都延时一段时间 ,accept返回的socket 有时候就不一样了 ,还是有相同的时候 。

论坛徽章:
0
2 [报告]
发表于 2011-12-18 16:25 |只看该作者
把代码拉出来溜溜

论坛徽章:
1
天蝎座
日期:2013-12-06 18:23:58
3 [报告]
发表于 2011-12-18 16:49 |只看该作者
如果是每个线程处理一个连接应该不会有问题吧。若是多个竞争一个。。

论坛徽章:
0
4 [报告]
发表于 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;
}

论坛徽章:
0
5 [报告]
发表于 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  

论坛徽章:
15
射手座
日期:2014-11-29 19:22:4915-16赛季CBA联赛之青岛
日期:2017-11-17 13:20:09黑曼巴
日期:2017-07-13 19:13:4715-16赛季CBA联赛之四川
日期:2017-02-07 21:08:572015年亚冠纪念徽章
日期:2015-11-06 12:31:58每日论坛发贴之星
日期:2015-08-04 06:20:00程序设计版块每日发帖之星
日期:2015-08-04 06:20:00程序设计版块每日发帖之星
日期:2015-07-12 22:20:002015亚冠之浦和红钻
日期:2015-07-08 10:10:132015亚冠之大阪钢巴
日期:2015-06-29 11:21:122015亚冠之广州恒大
日期:2015-05-22 21:55:412015年亚洲杯之伊朗
日期:2015-04-10 16:28:25
6 [报告]
发表于 2013-03-21 09:57 |只看该作者
ar996 发表于 2011-12-17 21:20
服务器端建立侦听 ,当多个客户端连接时 都很正常,当一个客户端 开启多个线程时(建立不同的socket),
发 ...

有这个问题,每创建一个线程需要usleep(5000);
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP