2013-01-09 49 views
-1

我写这样的代码的accept功能后,发现在C客户端地址如何使用socket编程

getpeername(rs,(struct sockaddr *)&clentaddr,&len); 

然后打印出来后,客户端地址显示为0.0.0.0

可以ü请试图帮助我

+2

你是怎么打印它的? clentaddr和len的定义是什么?这是没有足够的代码来打电话给你做错了什么。 – HerrJoebob

+1

你初始化了len = sizeof(sockaddr_in)吗? (我假设clientaddr也是sockaddr_in类型的)。 – selbie

+0

@selbie'sizeof(sockaddr_storage)'会更好... – glglgl

回答

0

accept()在称为accept()的结构的第二个参数中返回客户端的地址。

只有在没有错误发生的情况下才能做到这一点,因此检查系统调用的返回值总是一个好主意。

0
int accept(int s, 
    struct sockaddr *addr, 
    int *addrlen); 

在这里,在上面的定义地址存储传入的连接

addr:- 
The socket address of the connecting client that is filled in by accept 
before it returns. The format of addr is determined by the domain in which 
the client resides. This parameter can be NULL if the caller is not interested 
in the address of the client. If the addr parameter is not NULL, it points to 
a sockaddr structure. 
1

rs的地址必须侦听套接字如果被示出它作为绑定到0.0.0.0。尝试在插座上拨打它返回通过accept()

0
char IPAddress[16] = {0}; 
inet_ntop(AF_INET, &serveraddr.sin_addr.s_addr, IPChar, sizeof IPAddress); 

printf("The source is %s.\n", IPAddress); 

尝试这个代码

+0

rajesh我已经尝试过使用此代码也然后它也获取输出为0.0.0.0 – praveenpulicharla

0

到Rajesh的答案类似,我们可以利用在http://man7.org/linux/man-pages/man3/inet_ntop.3.html描述的inet_ntop功能。在另一个答案中缺少的部分是,整个sin_addr必须转换为struct inaddr *而不是实际访问s_addr成员。

char clntIP[INET_ADDRSTRLEN]; 
inet_ntop(AF_INET, (struct inaddr *)&clntAddr.sin_addr,clntIP,sizeof(clntIP)); 
printf("client IP is %s\n",clntIP); 

请确保您的文件中还有#include <arpa/inet.h>