服务器在同一台机器上时打印客户机ip

时间:2016-09-15 14:39:08

标签: c sockets tcp

我正在编写一个简单的tcp echo客户端服务器代码我的客户端和服务器代码都在同一台机器上运行我确实将两个不同的地址绑定到客户端和服务器但是连接到服务器时没有打印客户端IP地址我更改了地址仍然我无法打印地址我没有看到代码中的任何错误。这是我的操作系统问题,或者我犯了一些错误。

我的服务器代码:

    #include<stdio.h>
    #include<stdlib.h>
    #include<sys/socket.h>
    #include<sys/types.h>
    #include<string.h>
    #include<netinet/in.h>

    #define ERROR -1
    #define MAX_CLIENTS 10
    #define MAX_DATA 1024

    int main(int argc, char *argv[]){

        struct sockaddr_in server;
        struct sockaddr_in client;

        int sock;
        int new;
        int sockaddr_len = sizeof(struct sockaddr_in);
        int data_len;
        char data[MAX_DATA+1];

        if((sock = socket(AF_INET,SOCK_STREAM,0)) == ERROR){

            perror("server socket");
            exit(-1);

        }

        server.sin_family = AF_INET;
        server.sin_port = htons(atoi(argv[1]));
        inet_aton(argv[2],&server.sin_addr.s_addr);
        bzero(&server.sin_zero,0);

        if(bind(sock, (struct sockaddr *)&server,sockaddr_len) == ERROR){

            perror("bind");
            exit(-1);
        }

        if(listen(sock, MAX_CLIENTS) == ERROR){

            perror("listen");
            exit(-1);
        }

        while(1){

            if((new = accept(sock,(struct sockaddr *)&client,&sockaddr_len)) == ERROR){ 

                perror("accept");
                exit(-1);

            }

    //ip not getting printed
            printf("New client connected from port no %d IP %s\n",ntohs(client.sin_port),inet_ntoa(client.sin_addr.s_addr));

    data_len = 1;

    while(data_len){

        data_len = recv(new,data,MAX_DATA,0);

        if(data_len){

            send(new, data, data_len,0);
            data[data_len] = '\0';
            printf("Sent message: %s", data);


        }

    }

    printf("Client disconnected\n");
    close(new);

}
    }

我的客户代码:

    #include<stdio.h>
    #include<stdlib.h>
    #include<sys/socket.h>
    #include<sys/types.h>
    #include<string.h>
    #include<netinet/in.h>

    #define ERROR -1
    #define BUFFER 1024

    int main(int argc, char *argv[]){

        struct sockaddr_in remote_server,client;
        int sock,len;

        char input[BUFFER];
        char output[BUFFER+1];


        client.sin_family = AF_INET;
        client.sin_port = htons(3000);
        inet_aton("127.0.2.8",&client.sin_addr.s_addr);
        bzero(&client.sin_zero,0);

        if((sock = socket(AF_INET,SOCK_STREAM,0)) == ERROR){
            perror("socket");
            exit(-1);
        }

        int size = sizeof(struct sockaddr_in);

        if(bind(sock, (struct sockaddr *)&client,size) == ERROR){

            perror("bind");
            exit(-1);
        }

        remote_server.sin_family = AF_INET;
        remote_server.sin_port = htons(atoi(argv[2]));
        remote_server.sin_addr.s_addr = inet_addr(argv[1]); 
        bzero(&remote_server.sin_zero , 0);

        if((connect(sock ,(struct sockaddr *)&remote_server , sizeof(struct sockaddr_in))) == ERROR){

            perror("connect");
            exit(-1);

        }

while(1){

    fgets(input, BUFFER, stdin);
    send(sock, input, strlen(input) , 0);

    len = recv(sock,output,BUFFER,0);

    output[len] = '\0';

    printf("%s\n",output);

}

close(sock);

 }

这是输出: 从端口号3000和IP

连接的新客户端

1 个答案:

答案 0 :(得分:0)

首先,您需要在客户端和服务器

另外两个包含
#include<arpa/inet.h> // for inet_aton(), inet_addr() and inet_ntoa()
#include<unistd.h> //for close()

其次,

inet_aton()和inet_ntoa()的函数声明分别为:

int inet_aton(const char *cp, struct in_addr *inp);

char *inet_ntoa(struct in_addr in);

所以,你必须传递整个结构,即xyzaddr.sin_addr而不是xyzaddr.sin_addr.s_addr(这是一个int)

因此也可以进行这些更改

在服务器中:

inet_aton(argv[2],&server.sin_addr.s_addr); - &gt; inet_aton(argv[2],&server.sin_addr);

inet_ntoa(client.sin_addr.s_addr) - &gt; inet_ntoa(client.sin_addr)

在客户端:

inet_aton("127.0.2.8",&client.sin_addr.s_addr); - &gt; inet_aton("127.0.2.8",&client.sin_addr);