连接插座和FIFO管道

时间:2015-02-18 21:04:40

标签: c sockets pipe file-descriptor

我正在尝试将套接字连接到FIFO管道,但无法找到一种简单的方法。

目前我正在使用:

 char localbuf[2];

    while(1) {
            memset(localbuf,0,sizeof(localbuf));

            ret = read(sfd,localbuf,1);
            test(ret,"Unable to read from socket");

            ret = write(out,localbuf,1);
            test(ret,"Unable to write to out FIFO");

            read(in,localbuf,1);
            test(ret,"Unable to read from in FIFO");

            write(sfd,localbuf,1);
            test(ret,"Unable to write to socket");
    }

然而,这似乎非常低效和错误,因为它不应该发送数据,直到它收到换行符,但不能预先知道将有多少数据。

完整代码here

有更好的方法吗?

1 个答案:

答案 0 :(得分:1)

有一些提示要有更大的吞吐量:

1)在文件描述符上设置非阻塞模式。示例here

2)使用“select”或“poll”等待数据进入(许多示例可用,解释为here

3)放大读缓冲区(例如最多4 kb),这样您就可以在一次通话中接收更多数据。使用read的返回值知道实际接收的字节数。

4)写入整个接收缓冲区。检查write的返回值以了解实际传输了多少字节,write可以发送少于您请求的值。在那种情况下(可能是拥塞)稍后发送剩余的数据。如果准备写入fd,“select”也能发信号通知你。整个逻辑变得非常复杂,但如果吞吐量是你的目标,你可能不得不处理它。

5)此外,您可以将循环拆分为两个sepatare线程,一个用于in-> sfd方向,另一个用于sfd-> out方向。许多以前的说明仍然适用。