1

是否可以使用 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;
}

这几乎是从指南中获取的(尽管我有点明白?)。但我无法确定我将使用哪些信息来查找客户数据。

任何和所有的帮助表示赞赏,谢谢!

4

2 回答 2

3

通常,您可以使用 获取本地地址/端口信息getsockname(2),但在这里您还没有 - 套接字未连接并且没有发送任何内容。如果这是一个简单的 UDP 客户端 - 考虑使用连接的 UDP 套接字- 您将能够在connect(2).

于 2010-11-09T00:11:02.043 回答
0

对于未连接的 UDP 套接字,无法获取本地地址。您当然可以通过使用recvfrom而不是read/recv来读取数据包来获取远程地址。如果您只与单个服务器通信,请继续使用connect. 如果您需要与多台服务器通信,您可能只需对其中一台服务器进行虚拟connect(在新套接字上)以获取您的本地地址,但有可能(如果主机使用非平凡路由)连接到不同的服务器远程主机将导致不同的本地地址。localhost如果您同时连接到( 127.0.0.1) 和远程服务器,这甚至可能发生在相当简单的环境中。

于 2010-11-09T00:28:51.803 回答