如何从send迁移到writev?

时间:2015-03-12 15:44:14

标签: c sockets

我有很多

send(fd, buf, len, MSG_DONTWAIT | MSG_NOSIGNAL)

我希望合并为一个

writev(fd, iov, iovcnt)

但是,writev无法识别flags参数。在这种情况下如何设置套接字选项?

2 个答案:

答案 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的所有功能(以及其他一些你不会使用的东西,但没关系)