神们,帮忙解答如何能在 UDP socket 中 bind 0 port

2016-09-23 15:54:51 +08:00
 miterleo

Mac os X 10.11.6

执行 lsof -i udp -nP

这种情况 "*:*" 是怎么搞出来的?

2401 次点击
所在节点    程序员
3 条回复
gino86
2016-09-23 23:39:49 +08:00
*:* 这个应该是一个通配地址,第一个*表示 INADDR_ANY , 表示服务器监听本机的任意网卡,htonl(INADDR_ANY)。第二个*表示一个未知的端口,等到客户端连接的时候这个端口才得以确定
miterleo
2016-09-26 10:41:49 +08:00
@gino86 ,谢谢,第一个*很好理解,主要是第二个,按照你的理解,未知端口,等客户端连接后才能确定,那么客户端程序如何连接这个未知端口呢?
gino86
2016-09-26 11:52:36 +08:00
@miterleo socket 程序通讯通常分几个阶段, tcp 的程序比 udp 程序稍微复杂一点, tcp server 通过 bind listen accept 三个步骤。而*:*则产生在第一个和第二个步骤,即 bind 和 listen 阶段,第一个*产生于 bind 函数,而第二个*则产生于 listen 函数。对于服务器,第二个*实际上是 0 端口,(在 unix 网络编程卷 1 )中看到。而在 udp 程序中,通过测试(测试环境为 mac osx 10.11.6 ),一旦通过 socket 函数创建套接字后,这个通配地址就已经生成。

测试代码:
#include <stdio.h>
#include <stdlib.h>
#include <sys/types.h>
#include <sys/socket.h>
#include <string.h>
#include <errno.h>
#include <netinet/in.h>
#include <unistd.h>
#include <arpa/inet.h>

int main( int argc, char **argv )
{
int sockfd;
struct sockaddr_in servaddr;

if ( (sockfd = socket(AF_INET, SOCK_DGRAM, 0))<0 ) {
fprintf( stderr, "socket:%s\n", strerror(errno));
exit(EXIT_FAILURE);
}

int nread;
char buf[BUFSIZ];
while((nread = read(0, buf, BUFSIZ))>0)
{
}
return 0;
}

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/308473

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX