免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
12
最近访问板块 发新帖
楼主: lex.reiter
打印 上一主题 下一主题

如何定向标准输入到一个socket连接?(如何从fd read未知长度数据) [复制链接]

论坛徽章:
0
11 [报告]
发表于 2009-02-05 14:01 |只看该作者
原帖由 lex.reiter 于 2009-2-5 13:27 发表 [url=http://bbs.chinaunix.net/redirect.php?goto=findpost&pid=10016855&ptid=1363015][/url
我想实现的完整功能是:

client;
     connect to server

poll:如果标准输入或者socket有数据则:
        发送键盘输入到socket连接
     接收socket连接发来的数据并将数据写入标准输出

server:
      接受客户端发来的连接
    执行某个命令(可执行程序)(实现方式为先fork,再子进程execvp,子进程通过使用pipe和dup2将输出传给父进程)
    父进程将连接发来的数据作为命令的标准输入
    将命令的输出写回客户端连接


从你想实现的功能来看
不能对标准输入和标准输出做重定向,
你前面没把问题描述清楚,所以希望不要被我前面的dup2()误导

论坛徽章:
0
12 [报告]
发表于 2009-02-05 14:09 |只看该作者
如果只是重定向的话,dup2()完全可以

论坛徽章:
0
13 [报告]
发表于 2009-02-05 14:15 |只看该作者
不知道楼主有没有看过unix网络编程这本书

第六章 I/O Mutiplesing The select() and poll() functions
就有相关例子,解决你所要实现的功能

论坛徽章:
0
14 [报告]
发表于 2009-02-05 14:27 |只看该作者
原帖由 lex.reiter 于 2009-2-5 10:21 发表
在实现中,想截取标准输入,把输入写入到一个socket连接,并且把socket连接发来的数据写入标准输出,应该怎么实现?

如果使用先读后写的方式,因为读的长度未知,怎么避免read阻塞吊死??-



非阻塞 + event(SELECT()/EPOLL()/KQUEUE())通知.

来了数据就读, 有数据就写......

论坛徽章:
0
15 [报告]
发表于 2009-02-05 18:06 |只看该作者
我是使用poll,当fd上有数据时去读。
关键是不知道数据长度是多少,比如数据长度是2048(事先不知道),我定义的buf是1024,每次读1024.读完两次后再去读由于没有数据就阻塞在那了。这种情况一般怎么解决?

下午由于有其他事情,只是简单的用recv(fd, buf, buflen, 0)试了一下,现象比较怪,明明fd上有东西,但recv好像收不下来

论坛徽章:
0
16 [报告]
发表于 2009-02-05 18:08 |只看该作者
大家有类似的例子程序么?关于从socket连接或者pipe上读取不定长数据的

论坛徽章:
0
17 [报告]
发表于 2009-02-05 22:59 |只看该作者
原帖由 lex.reiter 于 2009-2-5 18:06 发表

关键是不知道数据长度是多少,比如数据长度是2048(事先不知道),我定义的buf是1024,每次读1024.读完两次后再去读由于没有数据就阻塞在那了。这种情况一般怎么解决?

...


用ioctl()的SIOCINQ或FIONREAD取一下先。

论坛徽章:
0
18 [报告]
发表于 2009-02-05 23:02 |只看该作者
原帖由 lex.reiter 于 2009-2-5 18:08 发表
大家有类似的例子程序么?关于从socket连接或者pipe上读取不定长数据的


我讲non-block/select/poll/epoll的例题   

其实啊,这个问题很简单,你开两个线程,一个负责读socket/写stdout;另一个负责读stdin/写socket就行了!
根本不用什么多路复用!多路复用是在解决N多对文件描述符的时候用的。

论坛徽章:
0
19 [报告]
发表于 2009-02-06 04:18 |只看该作者
你为何不发现有输入就创建个连接,搞完后就打印输出,然后关闭连接?
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP