【问题标题】:Handling send e recv errors in C在 C 中处理 send e recv 错误
【发布时间】:2019-05-05 15:13:59
【问题描述】:

我是 C 语言的新手,正在写一个 TCP 服务器

// create a socket, bind and listen
while(1) {
 accept:
 int conn_sock = accept(...);
 // here some recv and send calls
}

如果发生ECONNRESETEINTR,我想防止服务器关闭。如果在发送或接收数据时出现其中一个错误,我想去接受(如果accept() 由于某种原因也失败了,想去accept 标签)。

如果我没有发现这些错误,我的服务器会在客户端关闭连接时停止工作。

如何捕获这些错误并返回接受以与另一个客户端建立连接?

【问题讨论】:

  • 我在这里没有看到问题。你的需求很明确,为什么不简单地编写实现它们的代码呢?
  • 我认为问题很明确:我怎样才能捕捉到这些错误并返回接受?

标签: c sockets tcp error-handling


【解决方案1】:

错误accept() 返回-1。然后可以从errno 读取错误原因。

一种可能的方法是:

  int errno_accept;
  while (1)
  {
    errno_accept = 0;
    int accepted_socket = accept(...);
    if (-1 == accepted_socket)
    {
      errno_accept = errno;
      switch(errno_accept)
      {
        case EINTR:
        case ECONNRESET: /* POSIX does *not* define this value to be set 
                       by a failed call to accept(), so this case is useless. */

        default:
          /* Catch unhandled values for errno here. */

          break; /* Treat them as fatal. */

        ...
  } /* while (1) */

  if (0 != errno_accept)
  {
    /* Handle fatal error(s) here. */
  }

【讨论】:

  • 谢谢,对于 send 和 recv 功能,我可以这样做吗?
  • @GJCode:我可以,但你也可以......;):唯一的区别是 send()recv() 返回 ssize_t 而不是 int errno 的值各不相同。
猜你喜欢
  • 2016-08-02
  • 2019-03-14
  • 2016-02-24
  • 2013-08-11
  • 1970-01-01
  • 2014-05-05
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多