UDP Socket的发件人IP /端口

时间:2010-11-08 23:53:41

标签: c sockets udpclient

是否可以通过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;
}

这几乎是从指南中提取的(虽然我有点得到它?)。但是我无法确定用于查找客户端数据的信息。

感谢任何和所有帮助,谢谢!

2 个答案:

答案 0 :(得分:3)

通常,您使用getsockname(2)获取本地地址/端口信息,但此处尚未获得 - 套接字未连接且未发送任何内容。如果这是一个简单的UDP客户端 - 考虑使用connected UDP sockets - 您可以在connect(2)之后看到本地IP /端口。

答案 1 :(得分:0)

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