Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/sockets/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何在c中从sock结构中获取ip地址?_C_Sockets_Ip Address - Fatal编程技术网

如何在c中从sock结构中获取ip地址?

如何在c中从sock结构中获取ip地址?,c,sockets,ip-address,C,Sockets,Ip Address,我正在编写简单的服务器/客户机,试图获取客户机IP地址并将其保存在服务器端,以决定哪个客户机应该进入关键部分。我在谷歌上搜索了好几次,但找不到从sock结构中获取IP地址的正确方法 我相信这是一种在服务器接受客户端请求后从sock结构获取IP的方法。更具体地说,在c中,在服务器执行之后 csock = accept(ssock, (struct sockaddr *)&client_addr, &clen) 谢谢确定假设您正在使用IPV4,然后执行以下操作: struct s

我正在编写简单的服务器/客户机,试图获取客户机IP地址并将其保存在服务器端,以决定哪个客户机应该进入关键部分。我在谷歌上搜索了好几次,但找不到从sock结构中获取IP地址的正确方法

我相信这是一种在服务器接受客户端请求后从sock结构获取IP的方法。更具体地说,在c中,在服务器执行之后

csock = accept(ssock, (struct sockaddr *)&client_addr, &clen) 

谢谢

确定假设您正在使用IPV4,然后执行以下操作:

struct sockaddr_in* pV4Addr = (struct sockaddr_in*)&client_addr;
struct in_addr ipAddr = pV4Addr->sin_addr;
char str[INET_ADDRSTRLEN];
inet_ntop( AF_INET, &ipAddr, str, INET_ADDRSTRLEN );
如果希望ip地址作为字符串,请执行以下操作:

struct sockaddr_in* pV4Addr = (struct sockaddr_in*)&client_addr;
struct in_addr ipAddr = pV4Addr->sin_addr;
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 );

假设
client\u addr
中的
结构sockaddr\u(通常是这样)。您可以从
client\u addr.sin\u addr.s\u 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));

提取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的公认答案并不适用于所有体系结构。请参阅。

您忘记将
str
缓冲区传递到
inet\u ntop()
。而
sin\u addr
是一个结构-必须使用
sin\u addr.s\u addr
。值得注意的是,IPv4地址是以网络字节顺序存储的,要将其视为十六进制数字,需要使用
ntohl(pV4Addr->sin_addr.s_addr)
。注意。。。您还错过了我没有使用小写“in6_addr”;)在ntohl方面,我不经常麻烦,因为我仍然可以进行平等性检查(前提是两者都是按网络顺序进行的),这会破坏inet\u ntop(不是吗?)。这个问题被标记为C-在*
中的
struct sockaddr\u这样的类型中,不能忽略
struct
。另外,IPV4方法应该使用
struct in_addr
而不是
int
来存储地址,这与您展示的IPV6方法非常相似。您应该使用inet_ntoa()而不是手动处理位。
inet_ntoa
不是线程安全的,尽管这对于大多数使用它的情况可能并不重要。一个安全的替代方案是
inet\u ntop
@RemyLebeau Nice and simple。我喜欢。