【问题标题】:Finding IP Address of Client and Server in Socket ProgrammingSocket编程中查找客户端和服务器的IP地址
【发布时间】:2018-12-03 19:05:20
【问题描述】:

我已经开始练习 Socket 编程,并且我已经用 C 编写了客户端和服务器程序,它们之间的通信很好。但是,我希望找到客户端和服务器的 IP 地址并将其打印在两个程序中。

这是我的客户端代码...

#include <sys/socket.h>
#include <sys/types.h>
#include <netinet/in.h>
#include <netdb.h>
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include <unistd.h>
#include <errno.h>
#include <arpa/inet.h> 


struct node 
{
    int a;
    int b;
    char c[10];
};

int main(int argc, char const *argv[])
{
    int socketFD,port;
    struct sockaddr_in serverAddress, clientAddress;
    struct hostent *server;
    if (argc < 3) 
    {
       fprintf(stderr,"usage %s hostname port\n", argv[0]);
       exit(0);
    }
    port = atoi(argv[2]);
    socketFD = socket(AF_INET, SOCK_STREAM, 0);
    if (socketFD < 0) error("ERROR opening socket");
    server = gethostbyname(argv[1]);
    if (server == NULL) 
    {
        fprintf(stderr,"ERROR, no such host\n");
        exit(0);
    }
    bzero((char *) &serverAddress, sizeof(serverAddress));
    serverAddress.sin_family = AF_INET;
    bcopy((char *)server->h_addr,(char *)&serverAddress.sin_addr.s_addr, server->h_length);
    serverAddress.sin_port = htons(port);

    clientAddress.sin_family=AF_INET;
    clientAddress.sin_port=htons(port);
    clientAddress.sin_addr.s_addr=htonl(INADDR_ANY);

    if (connect(socketFD,(struct sockaddr *)&serverAddress,sizeof(serverAddress)) < 0) error("ERROR connecting");

    struct node temp;
    temp.a=21;
    temp.b=32;
    temp.c[0]='T';
    temp.c[1]='E';
    temp.c[2]='M';
    temp.c[3]='P';
    sendto(socketFD, (void *) &temp, sizeof(temp), 0, (struct sockaddr*)&serverAddress, sizeof(serverAddress));
    printf("%s - %s", inet_ntoa(serverAddress.sin_addr), inet_ntoa(clientAddress.sin_addr));


    return 0;
}

这是我的服务器代码

#include <sys/socket.h>
#include <sys/types.h>
#include <netinet/in.h>
#include <netdb.h>
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include <unistd.h>
#include <errno.h>
#include <arpa/inet.h> 


struct node 
{
    int a;
    int b;
    char c[10];
};


int main(int argc, char const *argv[])
{
    if (argc < 2) 
    {
        fprintf(stderr,"ERROR, no port provided\n");
        exit(1);
    }
    int socketFD,port,clientFD,clientLen;
    struct sockaddr_in serverAddress, clientAddress;
    if((socketFD=socket(AF_INET,SOCK_STREAM,0))<0)
    {
        printf("Unable to create socket\n");
        return 1;
    }
    bzero((char*)&serverAddress,sizeof(serverAddress));
    port=atoi(argv[1]);
    serverAddress.sin_family=AF_INET;
    serverAddress.sin_port=htons(port);
    serverAddress.sin_addr.s_addr=htonl(INADDR_ANY);

    if((bind(socketFD,(struct sockaddr *)&serverAddress, sizeof(serverAddress)))<0)
    {
        printf("Error on binding\n");
        return 1;   
    }
    listen(socketFD,5);
    clientLen=sizeof(clientAddress);
    clientFD=accept(socketFD, (struct sockaddr *)&clientAddress, &clientLen);

    struct node temp;
    recvfrom(clientFD, (void *)&temp, sizeof(temp), 0, (struct sockaddr*)&clientAddress,  &clientLen); 

    printf("%d-%d-%s\n", temp.a, temp.b, temp.c);
    printf("%s - %s", inet_ntoa(serverAddress.sin_addr), inet_ntoa(clientAddress.sin_addr));
     close(clientFD);
    return 0;
}

我面临的服务器程序的问题是,在输出中它正在打印给定结构变量的值,后跟一些未知字符,并且客户端和服务器的 IP 地址都打印为 0.0.0.0 ..

什么是问题以及如何解决它?

提前致谢

【问题讨论】:

  • 您是否尝试使用调试器,首先是客户端,然后是服务器端?您是否尝试控制 IO 函数的返回值?恕我直言,您应该以这种方式开始,看看问题出在哪里。
  • 您不会以空值终止 temp.c,因此使用 printf 打印它会调用未定义的行为。

标签: c sockets


【解决方案1】:

查看文档:

inet_ntoa() 函数将以网络字节顺序给出的 Internet 主机地址转换为 IPv4 点分十进制表示法中的字符串。字符串在静态分配的缓冲区中返回, 后续调用将覆盖哪些

【讨论】:

    【解决方案2】:

    您的代码中存在不同的问题。

    正如三十二上校所注意到的,在加载它之前不要将 temp 设置为 0,因此 c[4] 到 c[9] 中可能会有垃圾

    您在同一个 printf 中使用了 2 次 inet_ntoa,最终打印出第二个地址,正如 David Schwartz 所解释的那样

    你没有测试所有的功能

    您在客户端使用相同的端口进行绑定和连接。如果您尝试在 localhost 上进行通信,它无法工作,因为端口已经绑定到服务器。除非您有充分的理由这样做,否则您最好将客户端端口绑定到 0,这意味着选择任何合适的空闲端口

    一旦这个问题得到解决,您的程序就会正确地交换数据并显示两个地址。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2010-11-29
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-09-07
      • 2011-07-19
      相关资源
      最近更新 更多