检查非阻塞发送是否成功

时间:2012-12-12 14:31:53

标签: c sockets io

我在一个套接字上进行一次非阻塞发送调用,然后在另一个套接字上进行阻塞接收。之后我想检查非阻塞发送是成功还是失败。怎么办呢?

    while (i)
    {
      retval = send (out_sd, s_message, strlen (s_message), MSG_DONTWAIT);
      retval = recv (client_sd, r_message, MSG_LEN, 0);
      r_message[retval] = '\0';
      /* Here I want to wait for the non-blocking send to complete */
      strcpy (s_message, r_message);
      strcpy (r_message, "");
      i--;
    }

2 个答案:

答案 0 :(得分:5)

你在某种程度上混合同步和异步IO,这通常有点令人困惑,但我在这里看不到任何实际问题。

为了避免硬轮询(正在查看您的操作是否已在循环中完成),您应该使用select()等待您的通道/套接字可用于更多写入操作。这会告诉你前一个已完成(或者它完全由您的操作系统负责,这是相同的)。

select()函数是C中异步IO的基础,您应该在here中阅读它,this是我认为可能对您有用的示例。

注意虽然select()支持读,写和异常事件,但示例显示了一个读选择,你想做一个写选择。

答案 1 :(得分:1)

send()将返回发送的字节数或-1以防错误。

如果网络堆栈中有足够的缓冲区从您的消息中发送至少一些字节,retval将包含发送的字节数,这可能小于您要发送的字节数。如果网络堆栈缓冲区已满,则它将包含-1errno将设置为EAGAINEWOULDBLOCK

在所有情况下,发送呼叫在返回后立即完成。因此,您不必等待非阻塞发送在其他任何地方完成,您需要在send()调用返回后立即检查返回值。