c ++:TCP服务器"bind"功能失败(errno 98),如果我在两次连续应用程序启动之间没有等待足够的时间

c++ : TCP Server "bind" function failed (errno 98) if I do not wait enough time between two consecutive app launch

本文关键字:启动 之间 应用程序 两次 连续 时间 等待 服务器 bind TCP 功能      更新时间:2023-10-16

发现TCP套接字时,我根据对主题的理解和在网络上发现的一些教程进行了一个非常简单的测试

服务器:

void Server(void)
{
  int localSocket;
  int distantSocket;
  sockaddr_in serverInfo;
  sockaddr_in clientInfo;
  int sizeOfSocketInfo = sizeof(struct sockaddr_in);
  /* Open Socket */
  std::cout << "open socket" << std::endl;
  localSocket = socket(AF_INET, SOCK_STREAM, 0);
  if (localSocket == -1)
  {
    std::cout << "open failed, error - " << (int)errno << std::endl;
    exit(errno);
  }
  /* Configure server */
  serverInfo.sin_addr.s_addr = INADDR_ANY;
  serverInfo.sin_family = AF_INET;
  serverInfo.sin_port = htons(61001);
  /* Bind Socket */
  std::cout << "bind socket" << std::endl;
  if (bind (localSocket, (sockaddr *) &serverInfo, sizeof(serverInfo)) == -1)
  {
    std::cout << "bind failed, error - " << (int)errno << std::endl;
    exit(errno);
  }
  /* Wait for client */
  std::cout << "Wait for client ..." << std::endl;
  listen(localSocket, 1);
  distantSocket = accept(localSocket, (sockaddr *)&clientInfo, (socklen_t*)&sizeOfSocketInfo);
  std::cout << "client connected  - " << inet_ntoa(clientInfo.sin_addr) << std::endl;
  /* Close Socket */
  close (localSocket);
  close (distantSocket);
  std::cout << "socket closed" << std::endl;
}

和客户端:

void Client(void)
{
  int localSocket;
  sockaddr_in clientInfo;
  /* Open Socket */
  std::cout << "open socket" << std::endl;
  localSocket = socket(AF_INET, SOCK_STREAM, 0);
  if (localSocket == -1)
  {
    std::cout << "open failed, error - " << (int)errno << std::endl;
    exit(errno);
  }
  clientInfo.sin_family = AF_INET;
  clientInfo.sin_port = htons(61001);
  clientInfo.sin_addr.s_addr = inet_addr("127.0.0.1");
  /* Open Socket */
  std::cout << "connect to server" << std::endl;
  if (connect(localSocket, (sockaddr*)&clientInfo, sizeof(clientInfo)) < (int)0)
  {
    std::cout << "connect failed, error - " << (int)errno << std::endl;
    exit(errno);
  }
  std::cout << "connected !" << std::endl;
  close(localSocket);
}

当我在一个终端中启动服务器,在另一个终端启动客户端时,似乎还可以:

服务器端:

> ./tcpTest -s
open socket
bind socket
Wait for client ...
client connected  - 127.0.0.1
socket closed
> 

和客户端:

> ./tcpTest -c
open socket
connect to server
connected !
>

但是,如果在第一次尝试之后,我再次启动服务器。。。

> ./tcpTest -s
open socket
bind socket
bind failed, error - 98
>

我必须等待一段"特定的时间",我不知道确切的时间,也许一分钟,才能让服务器重新工作。

我不知道发生了什么,用sockstat打开套接字并没有显示任何奇怪的东西(我只看到mozilla套接字)。

我发现这个家伙也有同样的问题,但在Ruby基本的Ruby TCP服务器演示在启动时失败:`bind';:地址已在使用中,错误号::EADDRINUSE

如果这真的是同一个问题,我如何在C++中应用相同的解决方案?或者你知道吗?

感谢

您可能需要同时使用SO_REUSEADDR和SO_REUSEPORT。您可以进一步浏览Socket:Socket Docs 的文档

const int trueFlag = 1;
if (setsockopt(sockfd, SOL_SOCKET, SO_REUSEADDR, &trueFlag, sizeof(int)) < 0)
error("Failure");

您可以以类似的方式使用重用端口。希望这能帮助

尝试setsockopt(SO_REUSEADDR),这应该会有所帮助。