我正在编写简单的服务器/客户端并尝试获取客户端IP地址并将其保存在服务器端以确定哪个客户端应该进入关键部分。我用Google搜索了几次,但找不到从袜子结构中获取IP地址的正确方法。
我相信这是从客户端接受服务器请求后从sock结构获取IP的一种方法。更具体地说,在服务器执行后的c中
csock = accept(ssock, (struct sockaddr *)&client_addr, &clen)
谢谢
答案 0 :(得分:45)
好的,假设您使用的是IPV4,请执行以下操作:
struct sockaddr_in* pV4Addr = (struct sockaddr_in*)&client_addr;
struct in_addr ipAddr = pV4Addr->sin_addr;
如果您希望将ip地址作为字符串,请执行以下操作:
char str[INET_ADDRSTRLEN];
inet_ntop( AF_INET, &ipAddr, str, INET_ADDRSTRLEN );
IPV6也很容易......
struct sockaddr_in6* pV6Addr = (struct sockaddr_in6*)&client_addr;
struct in6_addr ipAddr = pV6Addr->sin6_addr;
获取字符串几乎与IPV4相同
char str[INET6_ADDRSTRLEN];
inet_ntop( AF_INET6, &ipAddr, str, INET6_ADDRSTRLEN );
答案 1 :(得分:34)
提取IP地址和端口号的更简单和正确的方法是:
printf("IP address is: %s\n", inet_ntoa(client_addr.sin_addr));
printf("port is: %d\n", (int) ntohs(client_addr.sin_port));
SoapBox接受的答案对于所有架构都不正确。请参阅Big and Little Endian。
答案 2 :(得分:25)
假设client_addr
是struct sockaddr_in
(通常是{1}}。您可以从client_addr.sin_addr.s_addr
获取IP地址(作为32位无符号整数)。
您可以通过以下方式将其转换为字符串:
printf("%d.%d.%d.%d\n",
int(client.sin_addr.s_addr&0xFF),
int((client.sin_addr.s_addr&0xFF00)>>8),
int((client.sin_addr.s_addr&0xFF0000)>>16),
int((client.sin_addr.s_addr&0xFF000000)>>24));