我目前正在使用 Winsock 2 开发一个C++网络程序,这是一个聊天程序,两台计算机之间没有服务器。如果没有强制用户运行具有侦听器的服务器程序,那将很方便,这使他们必须向前移植。当然,这将要求他们都输入彼此的IP,但这没关系。有没有办法通过在两台不同的计算机上运行相同的客户端程序来创建TCP连接,使用相同的端口,并且每台计算机输入另一台计算机的IP,而无需端口转发?
尽管您需要调用bind
才能允许另一台计算机连接到该端口,但您不需要调用accept
。
只要两个进程都在其接受端口上调用了bind
,那么假设地址sin
初始化为适当的目标,每个进程都可以使用如下所示的循环对称地相互连接:
while (connect(s, sin, slen) < 0) {
if (errno == ECONNREFUSED) continue;
perror("connect");
_exit(0);
}
这是 TCP 状态机图中的"同时打开"情况。每一端同时发送 SYN,因此每一端都使用 SYN/ACK 进行响应。双方发送ACK完成3次握手后,双方进入BUILT状态。
在线试用不支持线程或对环回的访问,但它确实允许我方便地展示完整的编码示例。
如果我正确理解您的任务:(不同网络中的2台家用计算机,没有"白色"IP地址;通过提供商连接到互联网的计算机(。
答:你不能。 您也不能通过UDP。
您需要一些带有IP地址的东西,可从外部网络获得。即命名为具有"白色"IP地址的服务器(或家用计算机(。并且那个"东西"应该接收你的TCP连接。
在TCP中,一方必须调用bind()
、listen()
和accept()
,而另一方必须调用connect()
。无法回避这一点,这就是TCP的工作方式。
如果侦听器位于 NAT/代理后面,则必须根据需要使用端口转发。
让客户端决定谁最初是侦听器,谁是连接器。如果连接失败,请反转角色并重试。如果连接仍然失败,则需要两个客户端都可以连接的外部服务器,以促进它们之间的通信。