如何知道TCP连接是否存在于同一机器上的两个进程之间
How to know if a TCP connection is between two processes on the same machine?
使用套接字编程api(例如,socket(), connect(), accept()…),我如何知道TCP连接是否在同一台机器上的两个进程之间?比如说,我有套接字文件描述符和远程ip。我可以简单地检查远程ip是否为127.0.0.1吗?
没有真正可靠的方法来确定这一点-您可以使用全局路由的IP地址连接到本地进程(即,本地进程可以使用127.0.0.1
以外的IP)。如果在虚拟化环境中,进程也可以在相同物理硬件上的不同虚拟机中运行。
注意,但是,如果远程IP(通过getpeername
)或本地IP(通过getsockname
)以127
(包括127.0.0.1
)开头,那么它确实是一个本地连接;然而,你不能排除它可能是本地连接的可能性,如果它是一个不同的地址对。
使用getsockname()
和getpeername()
来检索与连接相关的两个ip,然后使用gethostname()
和gethostbyname()
(或其他特定于平台的api,如Windows上的GetAdaptersInfo()
和GetAdapterAddresses()
)来确定属于本地机器的ip,然后您可以将连接ip与本地机器ip进行比较,看看它们是否都匹配。一台机器可以分配多个ip,同一台机器上的多个ip可以相互通信。
这是我使用的方法。这个想法是尝试将侦听器绑定到该IP地址,并使用失败/成功代码来确定该地址是否为本地地址。
我并不是说这特别有效,但它应该是相当可靠的,对于我的应用程序来说,这是合适的。
#include <sys/socket.h>
#include <errno.h>
/* ...probably need some other headers I am forgetting... */
int
is_local(const struct sockaddr *addr, socklen_t addr_len)
{
const char *func = "is_local()";
int result = 0;
int tmp = socket(addr->sa_family, SOCK_STREAM, 0);
if (tmp < 0) {
printf("%s: socket(%d,SOCK_STREAM,0) failed, errno %dn",
func, addr->sa_family);
goto out;
}
/* If bind() succeeds, or if it fails because the address is in
use, then the address must be local to this system. */
if (bind(tmp, addr, addr_len) < 0) {
if (errno == EADDRINUSE)
result = 1;
else if (errno == EADDRNOTAVAIL)
; /* do nothing; address is remote */
else
printf("%s: bind() unexpected error %dn", func, errno);
}
else {
result = 1;
}
close(tmp);
out:
return result;
}
你这样称呼它:
struct sockaddr_storage client_addr;
socklen_t client_addr_len = sizeof(client_addr);
int fd = accept(listener, &client_addr, &client_addr_len);
if (is_local((struct sockaddr *)&client_addr, client_addr_len))
/* peer is local */
如果您已经有了远程ip地址,您可以检查它是环回地址还是主机的ip地址,因为,正如cnicutar指出的那样,它不必通过环回地址作为本地连接。
- 给定两个偶数,求出它们之间所有偶数的平方和
- C++需要帮助从用户那里获得一个整数,并确保它在另外两个整数之间
- 如何在两个 boost::multi_arrays (C++) 之间执行数学运算?
- 查找字符在两个索引之间出现的次数
- 如何使用 OpenCV 解码在两个 UWP 应用之间发送的图像字节?
- C++两个源文件之间共享的枚举的静态实例
- 如何使用发送数据包所花费的时间计算两个节点之间的距离?
- 以天C++为单位的两个时间戳之间的差异
- 将向量之间的数字放在另一个向量之间<vector>>如果两个数字的差值为 1
- 我已经建立了递归关系,它找到了两个字符串之间最长的连续公共字符串,我怎么能跳过其中一个字符串中的一个字符
- 通过插槽和信号在不同线程中的两个qt对象之间进行通信
- 在C++中查找两个向量之间最相似的值
- 两个有符号数字之间的距离
- Directx 12 :在两个进程之间共享图形内存
- 如何找到两个日期之间的时间差异(以秒和纳秒为单位)?
- 是否有一种标准方法来计算两个 asctime() 值之间的天数
- 如何找到两个棋盘平面之间的角度?
- 计算两个迭代器之间的距离时"Vector Iterators Incompatible"
- 将两个数字替换为给定数组中介于两个之间的单个数字
- 如何在两个其他两个之间设置工具栏