获取客户端IP地址和端口?

时间:2014-11-02 05:36:11

标签: c sockets client server

我正在编写一个文件共享程序,它的主旨是所有客户端都连接到一个主服务器。但是,客户端是托管文件的计算机,因此当一个客户端从另一个客户端请求文件时,它必须与其建立连接。当客户端最初与主服务器连接时,我得到了它的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.所以当我尝试在使用127.0.0.1和40XXX的2个客户端之间建立连接时,我非常确定我有正确的客户端IP和端口但是它没有工作。 connect函数不断返回错误。这是尝试在两个客户端之间建立连接的代码:

    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);

非常感谢所有帮助!

2 个答案:

答案 0 :(得分:1)

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

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

答案 1 :(得分:0)

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

多个接口问题。执行ifconfig -a,找到正确的接口。