免费注册 查看新帖 |

Chinaunix

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

[C] 关于accept函数 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2009-04-02 19:24 |只看该作者 |倒序浏览
关于accept函数
newsockfd = accept (localSocket, (struct sockaddr *)&ClientAddr, (socklen_t*)&ClientAddrLen);

为何第一个client连接上来的时候,总是得不到客户端的地址,即ClientAddr为空

而后面客户端连上来的都可以得到地址。

论坛徽章:
0
2 [报告]
发表于 2009-04-02 20:27 |只看该作者

回复 #1 chealim 的帖子

全部贴出来看看

论坛徽章:
0
3 [报告]
发表于 2009-04-02 23:04 |只看该作者
while(1)
    {
        timeout.tv_sec         = 0;           
                timeout.tv_usec = 50000;
                nRecv = 0;
                idleNum = 0;

                MaxSockFD = localSocket;
        
        FD_ZERO(&readfds);
        FD_SET(localSocket, &readfds);
                for(i=0; i<4; i++)
                {
                if (clientSocket > 0)
                    FD_SET(clientSocket, &readfds);
                        else
                                idleNum++;
        
                        MaxSockFD = MAX(MaxSockFD, clientSocket);
                }

                if (idleNum == 4)        //如果4个客户端都没有连上来就认为本机是空闲的
                        g_SysStatus = CONNECT_SUB_HEART_DEVIDLE;
               
        nRet = select(MaxSockFD+1, &readfds, NULL, NULL, &timeout);
        if (nRet < 0)
        {
            printf("select error\n");
            continue;
        }
        else if (nRet == 0)
        {
            continue;
        }
        
                //检查是否有客户端连接上来
        if(FD_ISSET(localSocket, &readfds))
        {
                        if((newsockfd = accept (localSocket, (struct sockaddr *)&ClientAddr, (socklen_t*)&ClientAddrLen))<0)
                        {
                                perror("accept");
                                continue;
                        }
                        else
                        {
                                flagReg = 1;
                                g_SysStatus = CONNECT_SUB_HEART_DEVBUSY_ALARM;
                        }

                        if (flagReg)        //说明有客户端已经连接上来,要接收注册消息
                        {
                                //接收注册消息
                                if(recv(newsockfd, szBuffer, sizeof(szBuffer), 0) <= 0)
                    {
                        printf("connect closed.\n");
                        close(newsockfd);
                                        newsockfd = -1;
                    }
                                else
                                {
                                        memcpy((void*)&cmd, szBuffer, sizeof(ConnectType));
                                        if (-1 == ParseMsg(cmd, DecoderAttr))
                                                continue;
                                }
                                flagReg = 0;

                                continue;
                        }
                }

                //对于已经连接上的客户端进行管理
                for(i = 0; i<4; i++)
                {
                if (clientSocket>0)
                if(FD_ISSET(clientSocket, &readfds))
                {
                                //接收操作
                                ......
                }
                }
    }

论坛徽章:
0
4 [报告]
发表于 2009-04-02 23:13 |只看该作者
不用贴代码,常见错误!

ClientAddrLen未初始化成sizeof(ClientAddr)

:wink:

论坛徽章:
0
5 [报告]
发表于 2009-04-03 09:46 |只看该作者
版主很敏锐啊

论坛徽章:
0
6 [报告]
发表于 2009-04-03 10:23 |只看该作者
谢谢JohnBull
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP