首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >用Unix域套接字(UDS)连接(2)的替代品

用Unix域套接字(UDS)连接(2)的替代品
EN

Stack Overflow用户
提问于 2014-04-16 18:23:59
回答 1查看 1.1K关注 0票数 2

我试图在C++程序中尽可能快地将数据从一个UDS传递到另一个UDS,但是UDS的UDS不支持接合 (如fd_in)。是否有任何由UDS支持的替代方案尽可能接近于零拷贝?

这个问题被要求使用UDP套接字,但他们从未找到任何替代连接的方法。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2014-04-16 18:35:41

严格应答模式

这是一个很长的机会,但我想我还记得当fuse低级别接口获得splice()支持时。

所以,你可以实现一个保险丝驱动程序来做你想做的事。但是,只有当坚持具有与文件描述符兼容的接口时,这才有意义。我怀疑这是一个相当大的工作量,尽管像ntfs-3g这样的项目可能会实现它。

思考:

现在,你想达到什么目的?

根据我的经验,UNIX域套接字只用于机器内部进程间通信,而且数据的使用者可能实际上对接口的文件/流性质并不感兴趣。

如果只传递数据就足够了,那么您可能在这里使用mmapsplice

代码语言:javascript
复制
int fd;
char tmpfile[] = "/tmp/fooXXXXXX";
void *buffer;
int pfd[2];
ssize_t bytes;

fd = mkostemp(tmpfile, O_NOATIME);
unlink(tmpfile);
lseek(fd, 4095, SEEK_SET);
write(fd, "", 1);
lseek(fd, 0, SEEK_SET);
buffer = mmap(NULL, 4096, PROT_READ, MAP_PRIVATE, fd, 0);

pipe(pfd);
bytes = splice(s, NULL, pfd[1], NULL, 4096, SPLICE_F_MOVE);
splice(pfd[0], NULL, fd, NULL, bytes, SPLICE_F_MOVE);

警告:当将数据从mmap‘’ed缓冲区拼接到网络套接字时,不可能说所有数据都已发送。即使splice()返回,网络堆栈可能还没有发送所有数据。因此,重用缓冲区可以覆盖未发送的数据。

来自这个HowTo的背景信息

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/23117285

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档