繁体   English   中英

如何检查套接字的另一端是否已被接受?

[英]How to check if other end of a socket has been accepted?

我有一个客户端/服务器设置,我希望我的客户端知道服务器是否已接受连接。 否则我的客户不知道它还在等待被接受。 我不能依赖进一步的通信(协议规范)来验证这一点。 因此,例如,从服务器向客户端发送“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);
...

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

正如你所说:服务器上的“Good to go”消息不是选项。 怎么样:来自客户端的“回声”请求。 所以Server接受后会响应。

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

你应该检查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 */
      }
  }

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM