相关疑难解决方法(0)

POSIX 部分写入()

如在SUSv4描述或POSIX.1-2008
http://pubs.opengroup.org/onlinepubs/9699919799/functions/write.html#tag_16_685_08
写()调用可以比返回一个值以下为nbytes如果()坏到一个非阻塞管道/FIFO。因此,有必要检查返回值并在下面演示的循环中写入() 缓冲区的其余部分:

while (bytes_to_write > 0) {
    select(...);                 // Or poll()
    retv = write(...);
    if (retv < 0)
        ...                      // Error
    bytes_to_write -= retv;
}
Run Code Online (Sandbox Code Playgroud)

该标准没有提及常规文件、特殊文件(又名设备)和套接字,尤其是基于流的套接字(例如 TCP 套接字和 UNIX 域套接字)。

那么,我有以下两个问题:

  • 部分写入()(或部分发送())是否可能发生在常规文件(或未设置O_NONBLOCK 的套接字)上?
  • 如何writev可以获得()和SENDMSG()上NONBLOCK插座?这很重要,因为处理部分写入的向量(struct iovec [])有点麻烦。

对不起,英语蹩脚。

c sockets linux posix

6
推荐指数
2
解决办法
2785
查看次数

writev只写部分数据怎么处理?

我的数据自然是分段的,并且来自不同的来源,因此我writev按如下方式使用该函数。

char *buf0 = "short string\n";
struct bar *my_bar;
my_baz = get_my_baz();
iov[0].iov_base = buf0;
iov[0].iov_len = strlen(buf0);
iov[1].iov_base = my_bar;
iov[1].iov_len = sizeof (struct bar);
bytes_written = writev (sockfd, iov, 3);
Run Code Online (Sandbox Code Playgroud)

我想发送我的所有数据。如果 writev 一次只写入部分数据怎么办,例如:

bytes_written = 1;
Run Code Online (Sandbox Code Playgroud)

如何继续发送剩余数据?在write函数中,我们可以使用这个方法,那么writev呢?

sockets linux

3
推荐指数
1
解决办法
1025
查看次数

标签 统计

linux ×2

sockets ×2

c ×1

posix ×1