如何在没有侦听器的情况下创建 TCP 连接?

Bub*_*ckZ 3 c++ networking tcp winsock2

我目前正在使用 Winsock 2 开发一个 C++ 网络程序,它是一个在两台计算机之间没有服务器的聊天程序。如果没有用户被迫运行具有侦听器的服务器程序,这将很方便,这使得他们必须进行端口转发。当然,这会要求他们都输入彼此的 IP,但这没关系。有没有一种方法可以通过在两台不同的计算机上运行相同的客户端程序、使用相同的端口并且每台计算机输入另一台计算机的IP而无需端口转发来创建TCP连接?

jxh*_*jxh 5

尽管您需要调用bind以便允许另一台计算机连接到该端口,但您不需要调用accept.

只要两个进程都调用bind了它们的接受端口,然后假设地址sin被初始化为适当的目的地,每个进程就可以使用如下所示的循环对称地相互连接:

  while (connect(s, sin, slen) < 0) {
      if (errno == ECONNREFUSED) continue;
      perror("connect");
      _exit(0);
  }
Run Code Online (Sandbox Code Playgroud)

这就是TCP状态机图中的“同时打开”情况。双方同时发送 SYN,因此双方均以 SYN/ACK 进行响应。当双方发送ACK完成3次握手后,双方都进入ESTABLISHED状态。

Try It Online不支持线程或访问环回,但它确实允许我方便地呈现完整的编码示例。