【问题标题】:Getting client IP address and port?获取客户端 IP 地址和端口?
【发布时间】:2014-12-29 01:20:33
【问题描述】:

我正在编写一个文件共享程序,它的要点是所有客户端都连接到一个主服务器。但是,客户端是托管文件的机器,因此当一个客户端向另一个客户端请求文件时,它必须与它建立连接。当客户端最初与主服务器连接时,我得到它的 IP 和端口(我认为):

    int client_len = sizeof(client);
    int new_sd = accept(sd, (struct sockaddr *)&client, &client_len);

    char str[INET_ADDRSTRLEN]; 
    inet_ntop(AF_INET, &(client.sin_addr), str, INET_ADDRSTRLEN);
    //printf("%s\n", str);
    int port = (int) ntohs(client.sin_port);        
    //printf("Port is: %d\n", (int) ntohs(client.sin_port));

printf 给我 127.0.0.1 和 40XXX。主服务器使用 127.0.0.1 和端口 3000。所以我很确定我有正确的客户端 IP 和端口但是当我尝试使用 127.0.0.1 和 40XXX 在 2 个客户端之间建立连接时,它不起作用。连接函数不断返回错误。下面是尝试在两个客户端之间建立连接的代码:

    if ((cd = socket(AF_INET, SOCK_STREAM, 0)) == -1) {
    fprintf(stderr, "Can't creat a socket\n");
        exit(1);
    }
    bzero((char *)&cServer, sizeof(struct sockaddr_in));
    cServer.sin_family = AF_INET;
    cServer.sin_port = htons(cPort);
    if (inet_pton(AF_INET, cAddress, &cServer.sin_addr) == -1) {
        printf("inet_pton error occured\n");
        exit(1);
    } 

    /* Connecting to the server */
    if (connect(cd, (struct sockaddr *)&cServer, sizeof(cServer)) == -1) {
        fprintf(stderr, "Can't connect to server\n");
        exit(1);
    }

cPort 是一个 int 而 cAddress 是一个 char 数组。

这是客户端尝试为传入连接创建连接的代码。获取IP地址和端口的代码分别返回0.0.0.0和0。

    if ((sockfd = socket(AF_INET, SOCK_STREAM, 0)) == -1) {
    fprintf(stderr, "Can't creat a socket\n");
    exit(1);
}

/* Bind an address to the socket    */
bzero((char *)&clientServer, sizeof(struct sockaddr_in));
clientServer.sin_family = AF_INET;
clientServer.sin_port = 0;
clientServer.sin_addr.s_addr = htonl(INADDR_ANY);
if (bind(sockfd, (struct sockaddr *)&clientServer, sizeof(clientServer)) == -1){
    fprintf(stderr, "Can't bind name to socket\n");
    exit(1);
}

char str[INET_ADDRSTRLEN]; 
inet_ntop(AF_INET, &(clientServer.sin_addr), str, INET_ADDRSTRLEN);
printf("%s\n", str);
int clientServerPort = (int) ntohs(clientServer.sin_port);      
printf("Port is: %d\n", (int) ntohs(client.sin_port));

/* queue up to 10 connect requests  */
listen(sockfd, 10);

非常感谢所有帮助!

【问题讨论】:

    标签: c sockets client server


    【解决方案1】:

    您不能将客户端端口用于新连接。该端口仅用于连接到您的服务器,它不侦听传入连接。客户端需要绑定另一个端口,监听它,然后将该端口号发送给您。然后您可以将其发送到另一个客户端,它可以连接到端口。

    另请注意,如果第一个客户端位于 NAT 路由器后面,这可能根本不起作用。路由器不会知道它应该将这个新端口转发给客户端。当涉及 NAT 时,具有动态端口号的对等应用程序是不切实际的。相反,您应该为此目的定义一个专用端口;然后用户可以在他们的路由器上为此端口配置端口转发。

    【讨论】:

    • 这就是我最初尝试的。使用上面相同的代码在绑定后获取 IP 地址和端口号,但它返回 0.0.0.0 和 0。我更新了我的主帖。即使我严格使用本地 IP,NAT 路由器也会影响我吗?
    • 只有通过路由器时,NAT 才是问题。如果所有机器都在路由器后面,那不是问题。
    • 你需要调用getsockname()来获取bind()分配给socket的IP和端口。 stackoverflow.com/questions/10167540/…
    【解决方案2】:

    这就是我最初尝试的。使用上面相同的代码在绑定后获取 IP 地址和端口号,但它返回 0.0.0.0 和 0。我更新了我的主帖。即使我严格使用本地 IP,NAT 路由器也会影响我吗?

    多界面问题。做ifconfig -a,找到合适的接口。

    【讨论】:

    • 不确定您作为新用户是否有评论权限,但将来这将更适合作为对问题的评论而不是答案。
    猜你喜欢
    • 2011-01-08
    • 1970-01-01
    • 2015-07-27
    • 2019-01-14
    • 1970-01-01
    • 2013-07-07
    • 2011-05-26
    • 2019-11-13
    • 1970-01-01
    相关资源
    最近更新 更多