一个LINUX网络编程的问题

kingsun555 2009-01-09 10:18:35
这个程序是一个会话式的客户端,程序从标准输入接收到命令通过SOCKET发送到对方,对方返回结果。
系统早期是只有一个服务器,这个客户端程序较早版本是一父,一子两个进程专门处理发送和接收。
这个客户端可以发很多类型的命令,然后把结果返回并显示在标准输出。

但是现在服务器有2台,有个新的需求和改进(指针对某一个类型的工具,其他很多类型的服务器程序不能改动):
要求客户端起动的时候连一台,比如S1,一般情况下只需要S1 上的信息,但是某些时候同时需要另一台S2的信息,
这是临时打开一个与S2 的SOCKET连接,发送命令到S1,S2上,把信息接收完毕后,处理信息,显示。然后关掉S2的连接。
还要提供一个命令,在两个服务器之间切换,比如 switch,客户端接到这个命令把连接切换到另一台服务器上。

以前的父子进程专门处理发送和接收的结果不能适用,现在我采用了两个方案
1,只有一个进程,发送命令后接等着接收返回
2,只有一个进程,但是有两个线程,一个发送,一个接收,
但是都存在一个问题不好解决:就是不知道何时数据能接收完毕,这个问题是客观存在的,因为数据有时很多,有时很少,多者几万个字节,少者几个字节,

1号方案如下(大概的一个结构):
int main()
{
int sock = create_socket() ;
while(1)
{
if( fgets( stdin, buffer, 200 ) != NULL )
{
       //此处可能会临时建SOCKET,或者做切换
// send command
write( sock, buffer, strlen(buffer)+1 ) ;
      
}
else
{
return 0;
}
// set socket handle
FD_SET( sock, &read_set ) ;
while( 1 )
{
int ret = select( maxfd+1, &read_set, 0, 0, 0 ) ;
if( FD_ISSET( sock, &read_set ) )
{
int len = read( sock, buffer, LEN ) ;
}
       //如何从这个循环跳出,返回到主循环,是个问题,没有办法判断数据刚好读完。
}
}
}


有什么好的办法使得能够容易判断一个命令的返回结果读取完毕(长度指示是不行的,不能够改其他服务器程序的代码)?谢谢各位先!
...全文
135 9 打赏 收藏 转发到动态 举报
写回复
用AI写文章
9 条回复
切换为时间正序
请发表友善的回复…
发表回复
kingsun555 2009-01-09
  • 打赏
  • 举报
回复
[Quote=引用 3 楼 hairetz 的回复:]
给你的建议是,每次read完后返回到int ret = select( maxfd+1, &read_set, 0, 0, 0 ) ; 去掉里面那个while,不需要一次接收完所有数据,在每次数据要发送完的时候,在数据结尾加些特殊的数据作为结束标识符号,在接收段,自己把数据组起来。
[/Quote]

这种做法是不行的,因为不能改其他已经在用的服务器代码!(这个工具可以看很多种服务程序的信息,目前改的只是针对一个)
zzzlll1983 2009-01-09
  • 打赏
  • 举报
回复
学习
  • 打赏
  • 举报
回复
给你的建议是,每次read完后返回到int ret = select( maxfd+1, &read_set, 0, 0, 0 ) ; 去掉里面那个while,不需要一次接收完所有数据,在每次数据要发送完的时候,在数据结尾加些特殊的数据作为结束标识符号,在接收段,自己把数据组起来。
lala_benben 2009-01-09
  • 打赏
  • 举报
回复
有什么好的办法使得能够容易判断一个命令的返回结果读取完毕(长度指示是不行的,不能够改其他服务器程序的代码)?谢谢各位先! 。。。SORRYR这个没看到。。。
lala_benben 2009-01-09
  • 打赏
  • 举报
回复
。。你服务器发送数据的时候先发送这次需要发送的数据的长度。。
然后你在客户端就可以知道这次需要接收多少长度了啊
waizqfor 2009-01-09
  • 打赏
  • 举报
回复

UP
  • 打赏
  • 举报
回复
[Quote=引用 5 楼 kingsun555 的回复:]
引用 3 楼 hairetz 的回复:
给你的建议是,每次read完后返回到int ret = select( maxfd+1, &read_set, 0, 0, 0 ) ; 去掉里面那个while,不需要一次接收完所有数据,在每次数据要发送完的时候,在数据结尾加些特殊的数据作为结束标识符号,在接收段,自己把数据组起来。


这种做法是不行的,因为不能改其他已经在用的服务器代码!(这个工具可以看很多种服务程序的信息,目前改的只是针对一个)
[/Quote]

但是都存在一个问题不好解决:就是不知道何时数据能接收完毕,这个问题是客观存在的,因为数据有时很多,有时很少,多者几万个字节,少者几个字节,

那我只想问你一下,你的服务器能知道自己的数据什么时候结束不?如果它都不知道,别人怎么知道。如果数据结束了,服务器不加点标识,然后你又是多次发送,这怎么实现。不管什么办法,服务器肯定要做出一点动作,不然怎么可能。或者你可以考虑用端口号什么的,标识同一条消息。
huangpeng8612 2009-01-09
  • 打赏
  • 举报
回复
我觉得这完全是数据格式的问题.如果数据格式不变,基本上是没法做到的.
submarine2007 2009-01-09
  • 打赏
  • 举报
回复
这个工具可以看很多种服务程序的信息
-------------------------------------------------------

信息本身有格式么?

然后, 客户端发送命令有要求连续么? 如果是一条一条的发, 那么读取回复的时候可以考虑设置一个超时, 在第一次read后启动这个超时

69,371

社区成员

发帖
与我相关
我的任务
社区描述
C语言相关问题讨论
社区管理员
  • C语言
  • 花神庙码农
  • 架构师李肯
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧