C++ c++;:“TCP服务器”;绑定";如果在两次连续的应用程序启动之间没有等待足够的时间,则函数失败(错误号98)

C++ c++;:“TCP服务器”;绑定";如果在两次连续的应用程序启动之间没有等待足够的时间,则函数失败(错误号98),c++,sockets,tcp,bind,C++,Sockets,Tcp,Bind,在发现TCP套接字时,我根据对主题的理解和在网上找到的一些图图做了一个非常简单的测试 服务器: void Server(void) { int localSocket; int distantSocket; sockaddr_in serverInfo; sockaddr_in clientInfo; int sizeOfSocketInfo = sizeof(struct sockaddr_in); /* Open Socket */ std::cout &l

在发现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;
}
和客户端:

> ./tcpTest -c
open socket
connect to server
connected !
>
但是,如果在第一次尝试之后,我再次启动服务器

> ./tcpTest -s
open socket
bind socket
bind failed, error - 98
>
我必须等待一段“特定的时间”,我不知道到底需要多长时间,也许一分钟,才能让服务器重新工作

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

我发现这家伙也有同样的问题,但是在Ruby里

<>如果这真的是相同的问题,我如何在C++中应用同样的解决方案?或者你有什么想法


谢谢

试试
setsockopt(SO\u REUSEADDR)
,这应该会有帮助。

试试
setsockopt(SO\u REUSEADDR)
,这应该会有帮助。

您可能需要同时使用SO\u REUSEADDR和SO\u REUSEPORT。您可以进一步阅读Socket的文档:

const int trueFlag=1;
if(setsockopt(sockfd,SOL_SOCKET,SO_REUSEADDR,&trueFlag,sizeof(int))<0)
错误(“失败”);

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

您可能需要同时使用SO\u REUSEADDR和SO\u REUSEPORT。您可以进一步阅读Socket的文档:

const int trueFlag=1;
if(setsockopt(sockfd,SOL_SOCKET,SO_REUSEADDR,&trueFlag,sizeof(int))<0)
错误(“失败”);

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

这里讨论“特定时间”:这里讨论“特定时间”:非常感谢!我读了“绑定”的文档,但我没有想到
人插座
。。。问题解决了。非常感谢!我读了“绑定”的文档,但我没有想到
人插座
。。。问题解决了。
> ./tcpTest -c
open socket
connect to server
connected !
>
> ./tcpTest -s
open socket
bind socket
bind failed, error - 98
>
const int trueFlag = 1;
if (setsockopt(sockfd, SOL_SOCKET, SO_REUSEADDR, &trueFlag, sizeof(int)) < 0)
error("Failure");