【问题标题】:is it elegant to continue do connect() if connect() fails or accept() if accept() fails如果 connect() 失败则继续执行 connect() 或者如果 accept() 失败则继续执行 accept() 是否优雅?
【发布时间】:2013-05-02 05:25:42
【问题描述】:

在 tcp 客户端程序中使用 connect() 或在 tcp 服务器程序中使用 accept() 时 可能会发生许多可能的异常 例如,TCP SYN 或 TCP SYN/ACK 丢失或其他一些错误

(顺便说一句,我想知道,如果 TCP SYN 很多,connect() 会重新传输 TCP SYN 还是只会产生错误?)

通常源代码是这样的

if(connect()<0){
 ...
 exit(1);
}

或

if (accept()<)){
 ...
 exit(1);
}

但是,如果我想再次尝试 connect() 或 accept(), 有可能吗? 喜欢

while(connect()<0){
       continue;
}

或

while(accept()<0){
      continue;
}

这样的交易会产生不可接受的后果吗?

另外,send() 和 recv() 怎么样 谢谢!

【问题讨论】:

  • 优雅与它无关。问题是,您的功能要求是什么?

标签: networking network-programming


【解决方案1】:

通常一次,accept 或 connect 失败,它们总是会失败,所以你的 while 循环只是失败时的无限循环。有一些例外(非阻塞套接字会因 EINPROGRESS 或 EAGAIN 而“失败”),但通常当出现错误时,您需要检查错误代码并执行适当的操作,例如关闭套接字并打开一个新套接字。

【讨论】:

  • TCP SYN丢失的情况下,connect()函数会重传吗?
  • 没有。 connect() 失败并不意味着单个 SYN 数据包超时。 connect() failure 表示该数据包的所有重传失败。您无需编写任何代码即可使平台 TCP 堆栈简单地完成其工作。
  • 那么 send() recv(), fork() 失败怎么办?如果他们失败了,这意味着我需要关闭这个套接字或退出程序?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2022-08-09
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多