getsockname()可以将端口分配给struct addr_in吗?

时间:2013-08-21 15:45:34

标签: c networking

self._socket = socket(AF_INET, SOCK_DGRAM, 0);

// create addr
struct sockaddr_in addr;
bzero(&addr, sizeof(addr));
addr.sin_len = sizeof(addr);
addr.sin_family = AF_INET;
addr.sin_port = htons(0);
addr.sin_addr.s_addr = INADDR_ANY;

// bind socket
bind(self._socket, (struct sockaddr *)&addr, sizeof(addr));

printf("befor getsockname()->%d\n", ntohs(addr.sin_port));
socklen_t len = sizeof(addr);
getsockname(self._socket, (struct sockaddr *)&addr, &len); // if i comment this func, the last printf() will print 0; if not, it will print a real in use udp port(and it is correct!)
printf("after getsockname()->%d\n", ntohs(addr.sin_port));

那么,当将htons(0)分配给端口时,本地套接字必须使用getsockname()为自己分配可用端口吗?还是其他什么?   我想这可能是因为我只是将0绑定到sin_port这意味着分配一个随机端口但尚未由系统分配,所以只需调用getsockname()以使系统真正分配一个端口。

2 个答案:

答案 0 :(得分:2)

  

那么,当将htons(0)分配给端口时,本地套接字必须使用getsockname()为自己分配可用端口吗?还是其他什么?

不,您必须使用bind()为套接字分配端口。如果您指定为零,getsockname()会告诉您分配了哪个端口。

答案 1 :(得分:0)

getsockname函数的重点是获取套接字本地端的sockaddr。对于IPv4套接字,这是sockaddr_in类型的对象,它包含IP地址和端口。