我在一个套接字上进行一次非阻塞发送调用,然后在另一个套接字上进行阻塞接收。之后我想检查非阻塞发送是成功还是失败。怎么办呢?
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--;
}
答案 0 :(得分:5)
你在某种程度上混合同步和异步IO,这通常有点令人困惑,但我在这里看不到任何实际问题。
为了避免硬轮询(正在查看您的操作是否已在循环中完成),您应该使用select()等待您的通道/套接字可用于更多写入操作。这会告诉你前一个已完成(或者它完全由您的操作系统负责,这是相同的)。
select()函数是C中异步IO的基础,您应该在here中阅读它,this是我认为可能对您有用的示例。
注意虽然select()支持读,写和异常事件,但示例显示了一个读选择,你想做一个写选择。
答案 1 :(得分:1)
send()
将返回发送的字节数或-1
以防错误。
如果网络堆栈中有足够的缓冲区从您的消息中发送至少一些字节,retval
将包含发送的字节数,这可能小于您要发送的字节数。如果网络堆栈缓冲区已满,则它将包含-1
,errno
将设置为EAGAIN
或EWOULDBLOCK
。
在所有情况下,发送呼叫在返回后立即完成。因此,您不必等待非阻塞发送在其他任何地方完成,您需要在send()调用返回后立即检查返回值。