---------------------
这是服务器端的程序,另外还有一个客户端定时向server发送信息。
#include<sys/types.h>
#include<netinet/in.h>
#include<sys/socket.h>
int main()
{
int sock;
char buff[100];
socklen_t i;
char *p;
int pport;
struct sockaddr_in address,ad;
address.sin_family=AF_INET;
address.sin_port=htons(5678);
address.sin_addr.s_addr=htonl(INADDR_ANY);
sock=socket(AF_INET,SOCK_DGRAM,0);
source.sin_family=AF_INET;
ad.sin_family=AF_INET;
ad.sin_addr.s_addr=htonl(INADDR_ANY);
bind(sock,(struct sockaddr *)&address,sizeof(address));
memset(buff,0,100);
i = sizeof(struct sockaddr_in);
recvfrom(sock,buff,100,0,(struct sockaddr *)&source,&i);
printf("Data recieved is:%s\n",buff);
i = sizeof(struct sockaddr_in);
if(getsockname(sock,(struct sockaddr *)&ad,&i))
{
puts("Error!");
}
p=inet_ntoa(ad.sin_addr.s_addr);
printf("Ip is:%s\n",p);
close(sock);
}
7 个解决方案
#1
没有用过这个函数:(
我认为getsockname得到的ip地址是你绑定的ip, INADDR_ANY
我认为getsockname得到的ip地址是你绑定的ip, INADDR_ANY
#2
"如果当前没有绑定到该套接字的地址, 其结果没有定义".
自己看APUE去吧, 这是函数说明.
自己看APUE去吧, 这是函数说明.
#3
我认为事先没有绑定IP地址,也应该可以得到IP地址的。
#4
你用什么拿? 你没有把sock和sockaddr_in绑定, 没让他们形成映射, 你怎么通过sock取得sockaddr_in?
逻辑问题想清楚先
逻辑问题想清楚先
#5
getsockname()只有在套接口连接成功后才会填写Internet地址,所以这儿你不可以得到实际的IP,合理的做法是通过gethostbyname()得到主机地址。
#6
错误有二:
一:
p=inet_ntoa(ad.sin_addr.s_addr);
参数不对!
char *inet_ntoa(struct in_addr inaddr);
所以你应该改为:
p=inet_ntoa(&ad.sin_addr);
如果还不能得到正确结果,你可以换用函数试试
char buf[SIZE];
printf("%s",inet_ntop(AF_INET,&ad.sin_addr,buf,SIZE));
//这里的buf是存放inet_ntop的返回值。本行没有对inet_ntop进行错误处理(返回值为-1的情况)
二:
要得到确定的IP地址,得在accept之后,它由客户端决定。
假设服务器S有127.0.0.1和192.168.0.2两个地址。
当客户端C指定连接127.0.0.1时,服务端绑定的IP是127.0.0.1
当客户端C指定连接192.168.0.2时,服务端绑定的IP是192.168.0.2
我还是个大学生,如果对以上两点不明白,我也解释不清楚了
参考资料:
UNIX网络编程第3版(中文) P93,P69,P85
一:
p=inet_ntoa(ad.sin_addr.s_addr);
参数不对!
char *inet_ntoa(struct in_addr inaddr);
所以你应该改为:
p=inet_ntoa(&ad.sin_addr);
如果还不能得到正确结果,你可以换用函数试试
char buf[SIZE];
printf("%s",inet_ntop(AF_INET,&ad.sin_addr,buf,SIZE));
//这里的buf是存放inet_ntop的返回值。本行没有对inet_ntop进行错误处理(返回值为-1的情况)
二:
要得到确定的IP地址,得在accept之后,它由客户端决定。
假设服务器S有127.0.0.1和192.168.0.2两个地址。
当客户端C指定连接127.0.0.1时,服务端绑定的IP是127.0.0.1
当客户端C指定连接192.168.0.2时,服务端绑定的IP是192.168.0.2
我还是个大学生,如果对以上两点不明白,我也解释不清楚了
参考资料:
UNIX网络编程第3版(中文) P93,P69,P85
#7
getsockname不能获得udp只能获得tcp的
#1
没有用过这个函数:(
我认为getsockname得到的ip地址是你绑定的ip, INADDR_ANY
我认为getsockname得到的ip地址是你绑定的ip, INADDR_ANY
#2
"如果当前没有绑定到该套接字的地址, 其结果没有定义".
自己看APUE去吧, 这是函数说明.
自己看APUE去吧, 这是函数说明.
#3
我认为事先没有绑定IP地址,也应该可以得到IP地址的。
#4
你用什么拿? 你没有把sock和sockaddr_in绑定, 没让他们形成映射, 你怎么通过sock取得sockaddr_in?
逻辑问题想清楚先
逻辑问题想清楚先
#5
getsockname()只有在套接口连接成功后才会填写Internet地址,所以这儿你不可以得到实际的IP,合理的做法是通过gethostbyname()得到主机地址。
#6
错误有二:
一:
p=inet_ntoa(ad.sin_addr.s_addr);
参数不对!
char *inet_ntoa(struct in_addr inaddr);
所以你应该改为:
p=inet_ntoa(&ad.sin_addr);
如果还不能得到正确结果,你可以换用函数试试
char buf[SIZE];
printf("%s",inet_ntop(AF_INET,&ad.sin_addr,buf,SIZE));
//这里的buf是存放inet_ntop的返回值。本行没有对inet_ntop进行错误处理(返回值为-1的情况)
二:
要得到确定的IP地址,得在accept之后,它由客户端决定。
假设服务器S有127.0.0.1和192.168.0.2两个地址。
当客户端C指定连接127.0.0.1时,服务端绑定的IP是127.0.0.1
当客户端C指定连接192.168.0.2时,服务端绑定的IP是192.168.0.2
我还是个大学生,如果对以上两点不明白,我也解释不清楚了
参考资料:
UNIX网络编程第3版(中文) P93,P69,P85
一:
p=inet_ntoa(ad.sin_addr.s_addr);
参数不对!
char *inet_ntoa(struct in_addr inaddr);
所以你应该改为:
p=inet_ntoa(&ad.sin_addr);
如果还不能得到正确结果,你可以换用函数试试
char buf[SIZE];
printf("%s",inet_ntop(AF_INET,&ad.sin_addr,buf,SIZE));
//这里的buf是存放inet_ntop的返回值。本行没有对inet_ntop进行错误处理(返回值为-1的情况)
二:
要得到确定的IP地址,得在accept之后,它由客户端决定。
假设服务器S有127.0.0.1和192.168.0.2两个地址。
当客户端C指定连接127.0.0.1时,服务端绑定的IP是127.0.0.1
当客户端C指定连接192.168.0.2时,服务端绑定的IP是192.168.0.2
我还是个大学生,如果对以上两点不明白,我也解释不清楚了
参考资料:
UNIX网络编程第3版(中文) P93,P69,P85
#7
getsockname不能获得udp只能获得tcp的