是否可以通过C套接字获取发送方IP和(动态获取)端口?我有以下内容:
memset(&hints, 0, sizeof hints);
hints.ai_family = AF_UNSPEC;
hints.ai_socktype = SOCK_DGRAM;
if ((rv = getaddrinfo(NULL, DATABASEPORT, &hints, &servinfo)) != 0) {
fprintf(stderr, "getaddrinfo: %s\n", gai_strerror(rv));
exit(1);
}
for(p = servinfo; p != NULL; p = p->ai_next) {
if ((sockfd = socket(p->ai_family, p->ai_socktype, p->ai_protocol)) == -1) {
perror("socket");
continue;
}
break;
}
这几乎是从指南中提取的(虽然我有点得到它?)。但是我无法确定用于查找客户端数据的信息。
感谢任何和所有帮助,谢谢!
答案 0 :(得分:3)
通常,您使用getsockname(2)
获取本地地址/端口信息,但此处尚未获得 - 套接字未连接且未发送任何内容。如果这是一个简单的UDP客户端 - 考虑使用connected UDP sockets - 您可以在connect(2)
之后看到本地IP /端口。
答案 1 :(得分:0)
对于未连接的UDP套接字,无法获取本地地址。您当然可以使用recvfrom
而不是read
/ recv
来获取远程地址来读取数据包。如果您只与单个服务器通信,请继续使用connect
。如果您需要与多个服务器通信,您可以在其中一个服务器上创建一个虚拟connect
(在新套接字上)以获取本地地址,但这是可能的(如果主机使用非平凡的路由)连接到不同的远程主机将导致不同的本地地址。如果您同时连接到localhost
(127.0.0.1
)和远程服务器,这甚至可以在相当简单的环境中发生。