免费注册 查看新帖 |

Chinaunix

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

[C] inet_ntoa返回的IP为什么和netstat中查看到的IP不一样? [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2008-03-11 16:06 |只看该作者 |倒序浏览
程序源码:

if((rfd = accept(fd, (struct sockaddr *)&rsa, &rsa_len)) > 0 )
{
                               
    inet_ntop(AF_INET,&rsa.sin_addr,data_temp,MAX_BUF_LEN);
                               
    SHOW_LOG("Accept new connection %s:%d via fd:%d ",inet_ntoa(rsa.sin_addr), ntohs(rsa.sin_port),rfd,);
}

服务器监听到有连接,我通过以上代码查看连接客户端的IP,不管是inet_ntoa还是inet_ntop的结果都不正确,ntohs(rsa.sin_port)也是不正确的,
显示结果为:Accept new connection 10.0.0.0:0 via fd:5

但是通过netstat查看是正确的,显示结果为:
[root@rhel4 ~]# netstat
Active Internet connections (w/o servers)
Proto Recv-Q Send-Q Local Address               Foreign Address             State
tcp        0      0 192.168.1.211:8000          192.168.1.3:2372            ESTABLISHED


这是怎么回事?

请高手指点。

论坛徽章:
0
2 [报告]
发表于 2008-03-11 17:06 |只看该作者
把完整的代码贴上来!

论坛徽章:
0
3 [报告]
发表于 2008-03-12 08:57 |只看该作者
int rfd = 0 ;
struct         sockaddr_in rsa;
socklen_t rsa_len = 0;
int n = 0;
if(fd == lfd )
{
        if((ev_flags & E_READ))
        {
                if((rfd = accept(fd, (struct sockaddr *)&rsa, &rsa_len)) > 0 )
                {
                        SHOW_LOG("Accept new connection %s:%d via %d total %d ",inet_ntoa(rsa.sin_addr), ntohs(rsa.sin_port),rfd, ++(evbase->connections));
                       
                        /* set FD NON-BLOCK */
                        fcntl(rfd, F_SETFL, O_NONBLOCK);
                        if((events[rfd] = ev_init()))//除了监听的event都保存在events中
                        {
                                events[rfd]->set(events[rfd], rfd, E_READ|E_PERSIST,(void *)events[rfd], &ev_handler);
                                evbase->add(evbase, events[rfd]);
                        }
                        return ;
                }
                else
                {
                        FATAL_LOG("Accept new connection failed, %s", strerror(errno));
                }
        }       
        return ;
}


这段程序就是处理接受服务器连接的那一段代码。

论坛徽章:
0
4 [报告]
发表于 2008-03-12 09:46 |只看该作者
socklen_t rsa_len = 0;

论坛徽章:
0
5 [报告]
发表于 2008-03-12 10:08 |只看该作者
:wink: 把这句socklen_t rsa_len = 0;
改为socklen_t  rsa_len=sizeof(rsa);

论坛徽章:
0
6 [报告]
发表于 2008-03-12 14:11 |只看该作者
谢谢楼上两位~~
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP