我有很多
send(fd, buf, len, MSG_DONTWAIT | MSG_NOSIGNAL)
我希望合并为一个
writev(fd, iov, iovcnt)
但是,writev
无法识别flags
参数。在这种情况下如何设置套接字选项?
答案 0 :(得分:2)
你不能直接将它映射到writev(),你必须使用sendmsg()来实现这一点,因为sendmsg()将允许你进行分散 - 获取器发送,并包含相同的标志为send()。但是,您可以获得与这两个标志几乎相同的行为:
MSG_NOSIGNAL指示在发送/写入错误的情况下调用不应传送SIGPIPE信号,您将通过忽略SIGPIPE信号获得writev的相同行为:
signal(SIGPIPE,SIG_IGN);
这是一个流程范围,但会影响所有文件描述符。
MSG_DONTWAIT正在请求非阻止发送。对于writev,您必须将套接字设置为非阻塞 - 通常每个文件描述符只执行一次:
int flags = fcntl(fd,F_GETFL,NULL);
if(flags < 0 ) {
return flags;
}
return fcntl(fd,F_SETFL,flags | O_NONBLOCK);
答案 1 :(得分:2)
查找sendmsg
系统调用。它具有send
的所有功能以及writev
的所有功能(以及其他一些你不会使用的东西,但没关系)