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
您能从连接的TCP套接字确定源IP和端口吗?_C_Sockets_Msvcrt_Libc - Fatal编程技术网

您能从连接的TCP套接字确定源IP和端口吗?

您能从连接的TCP套接字确定源IP和端口吗?,c,sockets,msvcrt,libc,C,Sockets,Msvcrt,Libc,我想让我的服务器从连接的TCP套接字确定客户端的源IP和端口。因为我的客户可能是NAT的幕后黑手,所以我不能指望客户告诉我(在连接协议中)。。。如果这是可能的,我将需要在Windows和Linux上实现它。。。但这两个问题的答案都能帮助我开始 我正在使用C,我正在寻找基于libc或msvcrt的解决方案。如果您的客户机在NAT后面,则无法检测远程IP。如果您尝试这样做,您将始终获得NAT ip。我知道的唯一方法是将客户端IP与请求一起发送到服务器(作为请求的一部分) 但是你不清楚你想要什么。你没

我想让我的服务器从连接的TCP套接字确定客户端的源IP和端口。因为我的客户可能是NAT的幕后黑手,所以我不能指望客户告诉我(在连接协议中)。。。如果这是可能的,我将需要在Windows和Linux上实现它。。。但这两个问题的答案都能帮助我开始


我正在使用C,我正在寻找基于libc或msvcrt的解决方案。

如果您的客户机在NAT后面,则无法检测远程IP。如果您尝试这样做,您将始终获得NAT ip。我知道的唯一方法是将客户端IP与请求一起发送到服务器(作为请求的一部分)


但是你不清楚你想要什么。你没有告诉我们你在使用什么语言,也没有告诉我们你在谈论什么样的服务器。这将阻止我们给你一个有用的答案

如果您的客户端位于NAT后面,则无法检测远程IP。如果您尝试这样做,您将始终获得NAT ip。我知道的唯一方法是将客户端IP与请求一起发送到服务器(作为请求的一部分)


但是你不清楚你想要什么。你没有告诉我们你在使用什么语言,也没有告诉我们你在谈论什么样的服务器。这将阻止我们给你一个有用的答案

如果对方支持NAT,您可以谈论两个不同的IP(您的问题不清楚您想要哪一个):

  • 内部网络中对等方的IP(例如192.168.1.2)
  • NAT本身的外部IP
在前一种情况下,TCP/IP堆栈中没有可用的解决方案:此信息在主机上根本不存在,因为NAT用每个数据包自己的IP替换所有内部IP。因此,唯一的解决方案是在协议中支持此功能


在后一种情况下,您可以只问TCP/IP堆栈:您是如何做到的。

如果对等方在NAT后面,您可以谈论两个不同的IP(您的问题不清楚您想要哪一个):

  • 内部网络中对等方的IP(例如192.168.1.2)
  • NAT本身的外部IP
在前一种情况下,TCP/IP堆栈中没有可用的解决方案:此信息在主机上根本不存在,因为NAT用每个数据包自己的IP替换所有内部IP。因此,唯一的解决方案是在协议中支持此功能


在后一种情况下,您只需询问TCP/IP堆栈:您是如何做到这一点的。

应该在linux和windows中都能工作:

struct sockaddr_in addr;
socklen_t len;

len = sizeof addr;
getpeername(clientSocket, (struct sockaddr*)&addr, &len);
printf("Remote IP address: %s\n", inet_ntoa(addr.sin_addr));

应能在linux和windows中工作:

struct sockaddr_in addr;
socklen_t len;

len = sizeof addr;
getpeername(clientSocket, (struct sockaddr*)&addr, &len);
printf("Remote IP address: %s\n", inet_ntoa(addr.sin_addr));

可能重复?可能重复?他在哪里说他想要ipv6解决方案?他在哪里说他不想要?这只是需要注意的一点——我把这个答案投了赞成票(不合格的“IP”对我来说是IPv4或IPv6)。他在哪里说他想要IPv6解决方案?他在哪里说他不想要?这只是需要注意的一点——我对这个答案投了赞成票(不合格的“IP”对我来说是IPv4或IPv6)。