gpt4 book ai didi

c - Socket编程中查找客户端和服务器的IP地址

转载 作者:行者123 更新时间:2023-11-30 17:14:25 25 4
gpt4 key购买 nike

我已经开始练习套接字编程,并且我已经用 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..

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

提前致谢

最佳答案

查看文档:

The inet_ntoa() function converts the Internet host address in, given in network byte order, to a string in IPv4 dotted-decimal notation. The string is returned in a statically allocated buffer, which subsequent calls will overwrite.

关于c - Socket编程中查找客户端和服务器的IP地址,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30356043/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com