检查非阻塞发送是否成功

pho*_*xis 5 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--;
    }
Run Code Online (Sandbox Code Playgroud)

Fed*_*lli 5

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

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

select()函数是C语言中异步IO的基础,你应该在这里阅读它,是我认为可能对你有用的一个例子.

注意虽然select()支持读,写和异常事件,但示例显示了读取选择,您想要进行写入选择.