当前位置: 技术问答>linux和unix
如何根据udp连接的socket 获取通过该socket发送报文时所使用的ip地址和端口号
来源: 互联网 发布时间:2017-05-30
本文导语: 创建一个没有指定ip地址的udp连接socket bzero(&sock_addr, sizeof(sock_addr)); sock_fd = socket(AF_INET, SOCK_DGRAM, 0);//----->>udp 连接 sock_addr.sin_family = AF_INET; sock_addr.sin_addr = htonl(INADDR_ANY); //---->>没有指...
创建一个没有指定ip地址的udp连接socket
bzero(&sock_addr, sizeof(sock_addr));
sock_fd = socket(AF_INET, SOCK_DGRAM, 0);//----->>udp 连接
sock_addr.sin_family = AF_INET;
sock_addr.sin_addr = htonl(INADDR_ANY); //---->>没有指定具体的ip地址
g_cwmp_udp_port = cwmp_udp_random_port();
sock_addr.sin_port = htons(g_cwmp_udp_port);
rt = bind(sock_fd, (struct sockaddr *)&sock_addr, sizeof(sock_addr));
连接服务器,并使用 getsockname接口获取socket所使用的ip地址和端口号
rt = connect(sockfd, (struct sockaddr *)&out_addr, sizeof(out_addr));
if (rt != 0) {
CWMP_DPRINT(CWMP_DBG_UDP, "Failed to connect server!n");
return FALSE;
}
address_len = sizeof(out_addr);
getsockname(sockfd, (struct sockaddr *)&out_addr, &address_len);
CWMP_DPRINT(CWMP_DBG_UDP, "out address=%d, port=%d, g port=%dn",
out_addr.sin_addr, out_addr.sin_port, g_cwmp_udp_port);
问题:out_addr.sin_port端口号是正确的,但是out_addr.sin_addr一直为零,请问如果能获取到真正的ip地址呢?
bzero(&sock_addr, sizeof(sock_addr));
sock_fd = socket(AF_INET, SOCK_DGRAM, 0);//----->>udp 连接
sock_addr.sin_family = AF_INET;
sock_addr.sin_addr = htonl(INADDR_ANY); //---->>没有指定具体的ip地址
g_cwmp_udp_port = cwmp_udp_random_port();
sock_addr.sin_port = htons(g_cwmp_udp_port);
rt = bind(sock_fd, (struct sockaddr *)&sock_addr, sizeof(sock_addr));
连接服务器,并使用 getsockname接口获取socket所使用的ip地址和端口号
rt = connect(sockfd, (struct sockaddr *)&out_addr, sizeof(out_addr));
if (rt != 0) {
CWMP_DPRINT(CWMP_DBG_UDP, "Failed to connect server!n");
return FALSE;
}
address_len = sizeof(out_addr);
getsockname(sockfd, (struct sockaddr *)&out_addr, &address_len);
CWMP_DPRINT(CWMP_DBG_UDP, "out address=%d, port=%d, g port=%dn",
out_addr.sin_addr, out_addr.sin_port, g_cwmp_udp_port);
问题:out_addr.sin_port端口号是正确的,但是out_addr.sin_addr一直为零,请问如果能获取到真正的ip地址呢?
|
google以下2个函数
getsockname
getpeername
getsockname
getpeername
|
1、把getsockname放到bind之后呢,或者把bind去掉试下?
2、还有这代码有问题吧,out_addr是服务端地址,getsockname获取本地地址,咋用的都是一个变量?
2、还有这代码有问题吧,out_addr是服务端地址,getsockname获取本地地址,咋用的都是一个变量?
|
这两个api的功能更强,更安全。
getaddrinfo
getnameinfo
getaddrinfo
getnameinfo
|