免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
12下一页
最近访问板块 发新帖
查看: 6925 | 回复: 18
打印 上一主题 下一主题

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

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2009-02-05 10:21 |只看该作者 |倒序浏览
在实现中,想截取标准输入,把输入写入到一个socket连接,并且把socket连接发来的数据写入标准输出,应该怎么实现?

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

[ 本帖最后由 lex.reiter 于 2009-2-5 13:12 编辑 ]

论坛徽章:
0
2 [报告]
发表于 2009-02-05 10:26 |只看该作者
dup2()?

论坛徽章:
0
3 [报告]
发表于 2009-02-05 12:56 |只看该作者
直接dup2可以么? dup2应该只能把socket定向到输入,把输出定向到socket吧

可我想做的事情是相反的啊。

如果我想用read方式读之后再写,因为不知道read的长度,会阻塞吊死,这种情况怎么解决?

论坛徽章:
0
4 [报告]
发表于 2009-02-05 13:05 |只看该作者
原帖由 lex.reiter 于 2009-2-5 12:56 发表
直接dup2可以么? dup2应该只能把socket定向到输入,把输出定向到socket吧

可我想做的事情是相反的啊。

如果我想用read方式读之后再写,因为不知道read的长度,会阻塞吊死,这种情况怎么解决?

读一个写一个,呵呵
或者用select监视

论坛徽章:
0
5 [报告]
发表于 2009-02-05 13:09 |只看该作者
我用poll监视几个fd,比如监听0,socket链接,监听到有数据后用read去读,如果一次读不完,就继续读,可读读没数据了就吊死了??

论坛徽章:
0
6 [报告]
发表于 2009-02-05 13:13 |只看该作者
lz所说的吊死是什么意思?

论坛徽章:
0
7 [报告]
发表于 2009-02-05 13:14 |只看该作者
你的程序的角色是代理,这样的功能无法直接实现。现有的实现中,比较著名的有 netcat。

论坛徽章:
0
8 [报告]
发表于 2009-02-05 13:27 |只看该作者
吊死的意思是阻塞在那了-_-

我想实现的完整功能是:

client;
     connect to server

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

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

现在的问题是不论是服务器端父进程从pipe读数据,还是客户端和服务器端从socket读数据,都因为不知道数据的长度,使用read会阻塞住

[ 本帖最后由 lex.reiter 于 2009-2-5 13:29 编辑 ]

论坛徽章:
0
9 [报告]
发表于 2009-02-05 13:29 |只看该作者

回复 #8 lex.reiter 的帖子

就是telnetd<->telnet,可以参考这两个程序的源代码,也许还得知道一点pty的东西。

论坛徽章:
0
10 [报告]
发表于 2009-02-05 13:47 |只看该作者
原帖由 lex.reiter 于 2009-2-5 12:56 发表
直接dup2可以么? dup2应该只能把socket定向到输入,把输出定向到socket吧

可我想做的事情是相反的啊。


假设你的soket对应的对写文件描述符为connfd

dup2(STDIN_FILENO, connfd);
close(STDIN_FILENO);
把标准输入定向到soket

dup2(connfd, STDIN_FILENO);
close(connfd);
把socket定向到标准输入

dup2(STDOUT_FILENO, connfd);
close(STDOUT_FILENO);
标准输出定向到socket

dup2(connfd, STDOUT_FILENO);
close(connfd);
socket定向到标准输出
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP