我有一台服务器正在侦听多种设备(LAN,WiFi和某些VPN)。

侦听绑定套接字(AF_INET)绑定INADDR_ANY,以在所有接口上公开。

然后,客户端进行连接并开始交换。

在这一点上,我如何获得有关用于连接的设备的信息?

等效:如何获取用于连接的IP地址客户端?

编辑:
按照@Barmar的建议,我尝试了以下操作:

#include <sys/socket.h>
#include <netinet/ip.h>
#include <sys/un.h>
#include <stdlib.h>
#include <stdio.h>
#include <string.h>

#define handle_error(msg) \
        do { perror(msg); exit(EXIT_FAILURE); } while (0)

void error(char *msg)
{
    perror(msg);
    exit(1);
}

int main(int argc, char *argv[])
{
    int sockfd, newsockfd, portno;
    unsigned clilen;
    struct sockaddr_in serv_addr, cli_addr;
    struct sockaddr_in myaddr;
    sockfd = socket(AF_INET, SOCK_STREAM, 0);
    if (sockfd < 0)
        error("ERROR creating socket");
    bzero((char *) &serv_addr, sizeof(serv_addr));
    portno = 5666;
    serv_addr.sin_family = AF_INET;
    serv_addr.sin_addr.s_addr = INADDR_ANY;
    serv_addr.sin_port = htons(portno);
    if (bind(sockfd, (struct sockaddr *) &serv_addr, sizeof(serv_addr)) < 0)
        error("ERROR on binding");
    listen(sockfd, 5);
    clilen = sizeof(cli_addr);
    newsockfd = accept(sockfd, (struct sockaddr *) &cli_addr, &clilen);
    if (newsockfd < 0)
        error("ERROR on accept");

    clilen = sizeof(myaddr);
    if (getsockname(newsockfd, (struct sockaddr *)&myaddr, &clilen))
        error("ERROR in getsockname");

    unsigned int i = myaddr.sin_addr.s_addr;
    int p = myaddr.sin_port;
    int a = i & 0xff;
    i >>= 8;
    int b = i & 0xff;
    i >>= 8;
    int c = i & 0xff;
    i >>= 8;
    int d = i & 0xff;
    printf("my address is: %d.%d.%d.%d:%d\n", a, b,c, d, p);

    return 0;
}


...并且(经过一些调试)它可以工作。

请注意,端口不是预期值(5666),而是始终为8726。

最佳答案

如果您使用的是SOCK_STREAM套接字(即TCP),而不是SOCK_DGRAM(即UDP),请在getsockname()返回的套接字上调用accept()

如果您使用的是数据报套接字,那么我认为没有一种可移植的方法可以使用单个套接字。传统的解决方案是为每个本地地址绑定一个单独的套接字,而不是使用INADDR_ANY,然后使用epoll()select()在所有套接字上等待消息。您可以根据接收消息的套接字知道它们连接到的地址。

Linux和Windows具有扩展名,可通过在套接字上设置IP_PKTINFO选项并使用recvmsg()接收数据包来使此操作更加容易。在msgheader.msg_control中,您可以获取数据包的目标地址。见Get destination address of a received UDP packet

关于c - 如何获取用于连接服务器的IP地址?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/52412757/

10-11 21:23
查看更多