C 如何检查插座的另一端是否已被接受?

C 如何检查插座的另一端是否已被接受?,c,linux,sockets,unix-socket,C,Linux,Sockets,Unix Socket,我已经设置了客户机/服务器,我想让我的客户机知道服务器是否已接受连接。否则我的客户就不知道它还在等待被接受。我不能依靠进一步的通信(协议规范)来验证这一点。例如,从服务器向客户端发送“Good to go”字符串不是一个选项。是否有一个标志或其他东西,我可以检查服务器是否确实接收到了?下面是一些示例代码: /* Client */ ... getaddrinfo(ip, port, &hints, &servinfo); connect(sockfd, info->ai_a

我已经设置了客户机/服务器,我想让我的客户机知道服务器是否已接受连接。否则我的客户就不知道它还在等待被接受。我不能依靠进一步的通信(协议规范)来验证这一点。例如,从服务器向客户端发送“Good to go”字符串不是一个选项。是否有一个标志或其他东西,我可以检查服务器是否确实接收到了?下面是一些示例代码:

/* Client */
...
getaddrinfo(ip, port, &hints, &servinfo);
connect(sockfd, info->ai_addr, info->ai_addrlen);

if (info == NULL) {
    printf("connection failure\n");
    exit(1);
}

inet_ntop(info->ai_family, get_in_addr((struct sockaddr *)info->ai_addr), ipstring, sizeof(ipstring));
printf("Connected to %s!\n", ipstring);
...

/* Server */
...
pause(); /* If don't accept the connection, how to make the client know? */ 
new_fd = accept(sockfd, (struct sockaddr *)&cli_addr, &addr_size);
...

您应该检查
connect()
中的返回值,因为它将通过
errno
指示失败的原因

您案例中的
connect()
调用将超时,因此
connect()
将返回
-1
,并且
errno
设置为
ETIMEDOUT

  int ret = connect(sockfd, info->ai_addr, info->ai_addrlen);
  if (ret == -1) {
      /* connect failed */
      switch(errno) {
      case ETIMEDOUT:
             /* your server didn't accept the connection */
      case ECONNREFUSED:
             /* your server isn't listening yet, e.g. didn't start */
      default:
             /* any other error, see man 2 connect */
      }
  }

由于积压工作,服务器可以在接受调用之前发送SYN-ACK。因此,客户端调用
connect()
可以在服务器调用
accept()
之前返回

正如您所说,来自服务器的“goodtogo”消息不是选项。 客户端的“echo”请求如何。所以服务器将在接受后响应


如果TCP流中的任何额外流量不是一个选项。您可以使用辅助数据吗?

如果未接受,则没有连接,并且将在客户端超时。你需要另一个连接来做你想做的事情,这只会解决问题。为了发送未被接受的消息,它需要接受连接才能发送…在大多数情况下,检查系统调用的返回值都是一个好主意。如果这表明有错误,那么检查
errno
的值,如果手册页声明它设置为错误,将提供更大的启发。我已经检查了所有内容,为了简洁起见,它们没有包括在内。啊,我的错。我忘了包括我有一个待办事项,以确保我不中断任何连接。与检查
ETIMEDOUT
相比,我是否应该放弃积压工作并在客户端实现某种指数重试方法来连接呢。另一个选项是重写服务器应用程序以异步处理连接,并接受连接以供以后处理。您可能想看看。不再有客户端的限制因素不在于套接字,因此永远不会触发ETIMEDOUT。我会调查libevent,看看他们是否有我需要的任何实现,谢谢。我相信辅助数据是可以接受的,即使没有,我还是很想知道这种方法将如何解决这个问题。请您举个例子好吗?