1
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() 即可使系统真正分配一个端口。

4

2 回答 2

2

那么,是不是在将 htons(0) 分配给一个端口时,本地套接字必须使用 getsockname() 为自己分配一个可用端口?还是别的什么?

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

于 2013-08-22T01:48:05.680 回答
0

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

于 2013-08-21T16:32:02.420 回答