gpt4 book ai didi

unix - 如何获取客户端的IPv4地址?

转载 作者:行者123 更新时间:2023-12-01 05:39:44 26 4
gpt4 key购买 nike

我正在准备一个简单的工作项目,并试图熟悉 Unix 开发环境中套接字编程的基础知识。在这一点上,我有一些基本的服务器端代码设置,用于在父套接字创建并设置为监听后监听来自客户端的传入 TCP 连接请求...

int sockfd, newfd;    
unsigned int len;
socklen_t sin_size;
char msg[]="Test message sent";
char buf[MAXLEN];
int st, rv;
struct addrinfo hints, *serverinfo, *p;
struct sockaddr_storage client;
char ip[INET6_ADDRSTRLEN];

.
. //parent socket creation and listen code omitted for simplicity
.

//wait for connection requests from clients
while(1)
{
//Returns the socketID and address of client connecting to socket
if( ( newfd = accept(sockfd, (struct sockaddr *)&client, &len) ) == -1 ){
perror("Accept");
exit(-1);
}

if( (rv = recv(newfd, buf, MAXLEN-1, 0 )) == -1) {
perror("Recv");
exit(-1);
}
struct sockaddr_in *clientAddr = ( struct sockaddr_in *) get_in_addr((struct sockaddr *)&client);
inet_ntop(client.ss_family, clientAddr, ip, sizeof ip);
printf("Receive from %s: query type is %s\n", ip, buf);

if( ( st = send(newfd, msg, strlen(msg), 0)) == -1 ) {
perror("Send");
exit(-1);
}

//ntohs is used to avoid big-endian and little endian compatibility issues
printf("Send %d byte to port %d\n", ntohs(clientAddr->sin_port) );

close(newfd);
}

}

我在网上找到了get_in_addr函数,把它放在我代码的顶部,用它来获取客户端连接的IP地址...

// get sockaddr, IPv4 or IPv6:
void *get_in_addr(struct sockaddr *sa)
{
if (sa->sa_family == AF_INET) {
return &(((struct sockaddr_in*)sa)->sin_addr);
}

return &(((struct sockaddr_in6*)sa)->sin6_addr);
}

但该函数始终返回 IPv6 IP 地址,因为那是 sa_family 属性设置的内容。

我的问题是,IPv4 IP 地址是否存储在我正在使用的数据中的任何位置?如果是,我该如何访问它?

非常感谢您的帮助!

最佳答案

如果您获得的是 IPv6 地址,那么这就是客户端用于连接的地址。 IPv6 和 IPv4 地址之间没有 1-1 的对应关系,IP 地址和客户端设备之间也没有。

这有点像说您收到了某人的电子邮件,但您无法根据他们的电子邮件地址计算出他们的邮寄地址。

关于unix - 如何获取客户端的IPv4地址?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2493136/

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