首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何检查套接字的另一端是否已被接受?

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

Stack Overflow用户
提问于 2012-05-11 19:11:05
回答 2查看 1.9K关注 0票数 3

我设置了一个客户机/服务器,我想让我的客户机知道服务器是否接受了连接。否则我的委托人不知道它还在等着被接受。我不能依靠进一步的通信(协议规范)来验证这一点。因此,例如,从服务器向客户端发送"Good to go“字符串不是一种选择。是否有一个标志或什么,我可以检查,看看服务器是否真的在接收?下面是一些示例代码:

代码语言:javascript
复制
/* 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);
...
EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2012-05-11 19:41:59

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

正如你所说:来自服务器的"Good to go“消息不是可选的。比如:来自客户端的"echo“请求。因此,服务器将在接受后响应。

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

票数 4
EN

Stack Overflow用户

发布于 2012-05-11 19:16:12

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

在本例中,connect()调用将超时,因此connect()将返回-1,并将errno设置为ETIMEDOUT

代码语言:javascript
复制
  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 */
      }
  }
票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/10550219

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档