使用socket编程API(例如,插座(),连接(),接受()......),我怎么能知道,如果一个TCP连接是两个过程之间的同一台机器上?说,我有套接字文件描述符,和远程IP。我可以简单地检查远程IP是否为127.0.0.1?如何知道TCP连接是否在同一台机器上的两个进程之间?
回答
这里是我使用的方法。我们的想法是尝试将侦听器绑定到该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 %d\n",
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 %d\n", 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 */
我喜欢这种方法! – flyingbin 2012-01-03 22:23:32
有没有确定这真的是可靠的方法 - 您可以连接到使用全局路由的IP地址(即本地进程可以使用比127.0.0.1
其它IPS)本地进程。如果您处于虚拟化环境中,还可以在同一物理硬件上的不同虚拟机中运行进程。
但是请注意,如果远程IP(经由getpeername
)或本地IP(通过getsockname
)与127
(包括127.0.0.1
)开始,然后这的确是一个本地连接;但是,如果它是一对不同的地址,则不能排除可能为为本地连接的可能性。
如果你已经有了远程IP地址,你可以检查它是否是环回地址,或者它是否是主机的IP地址,因为正如cnicutar指出的那样,它不必经过环回地址是本地连接。
使用getsockname()
和getpeername()
中检索与连接相关的两个IP地址,然后使用gethostname()
和gethostbyname()
(或其他特定平台的API,如GetAdaptersInfo()
和GetAdapterAddresses()
在Windows上),确定属于本地计算机的IP地址,然后您可以将连接IP与本地机器IP进行比较,看它们是否匹配。一台机器可以分配多个IP,并且同一台机器上的多个IP可以相互通信。
- 1. 使用tcp在同一台机器上的进程间通信
- 2. 同一Linux机器上两个应用程序之间的tcp连接是否会断开
- 3. 在一台机器上运行的进程如何知道另一个进程是否在使用c/C++的linux中的不同机器上运行?
- 4. 两台机器在同一个wifi上时如何连接到一个servlet?
- 5. 在两台机器上运行的进程之间的通信
- 6. 如何在同一台机器上的程序之间进行通信?
- 7. 如何知道在java中是否完成了tcp连接?
- 8. 如何在两个接口之间隧道连接Telnet连接?
- 9. 两个64位机器之间的TCP套接字编程
- 10. 如何在两台不同的机器上连接两个mysql数据库?
- 11. 我如何知道我是否在道路两点之间android
- 12. 如果一台机器死机,TCP连接如何终止?
- 13. 同一台计算机上的两个程序之间的通信 - 如何?
- 14. 同一台机器上的两个进程可以连接到同一个端口吗?
- 15. 在同一台机器上连接两个本地uwp应用程序
- 16. 同一台机器上的端点之间的套接字连接
- 17. Java - 在同一网络上连接两台机器
- 18. Android - 如何知道TCP连接是否仍然打开
- 19. 如何知道一台机器是否可以用c#ping?
- 20. Boost.MPI/Boost.Interprocess - 如何检测进程是否在同一台机器上运行?
- 21. 在多台机器上的进程之间的锁机制
- 22. 在主机之间建立TCP连接
- 23. 如何连接2台运行在同一台机器上的虚拟主机?
- 24. 同一台计算机上的两个不同浏览器是否可以使用websocket连接到服务器?
- 25. 如何知道正在运行的后台进程是否为
- 26. 位于一台机器上或两台机器上的两个进程的Java nio套接字通信
- 27. 如何知道两个NSDate是否在同一天
- 28. 谁在同一台机器上连接两个android模拟器runnnig?
- 29. 在同一台机器上的ASP.NET应用程序之间进行通信
- 30. 如何模拟两台计算机之间的无线连接?
你可以尝试调用'getsockname()'和'getpeername()'同一插座上,然后比较返回的地址。 – 2012-01-03 21:31:48
在同一台计算机上禁止多个网络设备,您是否可以检查连接每端的MAC地址,并查看它们是否相同? – abelenky 2012-01-03 21:42:24
通常没有MAC报头,因此没有MAC地址,在环回上使用。 – 2012-01-03 21:52:53