2013-10-25 74 views
2

我有一个服务器正在侦听端口
该请求从我的本地客户端发送到本地pc上运行的服务器。
以下是我的代码片断为什么我从recvfrom()获得远程IP地址0.0.0.0?

remote_len = sizeof(remote_addr); 
if ((bytes=recvfrom(sockfd, buf, MAXBUFLEN , 0, 
(struct sockaddr *)&remote_addr, &remote_len)) <= 0) { 
    exit(1); 
} 

printf("remote ip = %s\n",inet_ntoa(remote_addr.sin_addr)); 

当我打印的IP我得到0.0.0.0?
这不是我想要打印的远程IP地址吗?
编辑:它是一个TCP套接字,我成功地收到了缓冲区。

+0

'recvfrom'返回什么值?它是否成功?什么类型的套接字?它连接了吗? etc ... –

+0

是的,它成功了。它是一个TCP套接字 – SPB

+0

remote_len的值是什么?您可能正在获取IPv6回送地址。 –

回答

2

请参阅TCP recvfrom() doesn't store 'from' - 显然它不支持TCP。你看到的只是原来存在的零字节。这就是为什么remote_len返回0 - 因为没有设置地址。

该链接是与windows相关的文档;在Linux手册页中我没有看到这种行为,它只说“可能用于在套接字上接收数据,不管它是否面向连接”,但在http://www.beej.us/guide/bgnet/output/html/multipage/recvman.html上它表示recvfrom是针对UDP的。不幸的是,在Harbison + Steele中没有提及,我找不到Unix网络编程的副本。

+0

谢谢...现在我正在使用getpeername()来获取远程地址,并将recvfrom()更改为recv() – SPB