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() を使用して使用可能なポートをそれ自体に割り当てる必要がありますか? それとも何か?これは、ランダムなポートを割り当てることを意味するが、システムによってまだ割り当てられていない sin_port に 0 をバインドしたためだと思います。

4

2 に答える 2

2

では、htons(0) をポートに割り当てる場合、ローカル ソケットは getsockname() を使用して使用可能なポートをそれ自体に割り当てる必要がありますか? それとも何か?

bind()いいえ、ソケットにポートを割り当てるために使用する必要があります。getsockname()ゼロを指定した場合、どのポートが割り当てられたかがわかります。

于 2013-08-22T01:48:05.680 に答える