求助:LINUX 网络编程的一个问题

kingsun555 2009-01-09 10:20:18
这个程序是一个会话式的客户端,程序从标准输入接收到命令通过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, &back_set ) ;
while( 1 )
{
        read_set = back_set ; 
int ret = select( maxfd+1, &read_set, 0, 0, 0 ) ;
if( FD_ISSET( sock, &read_set ) )
{
int len = read( sock, buffer, LEN ) ;
}
       //如何从这个循环跳出,返回到主循环,是个问题,没有办法判断数据刚好读完。
}
}
}


有什么好的办法使得能够容易判断一个命令的返回结果读取完毕(长度指示是不行的,不能够改其他服务器程序的代码)?谢谢各位先!
...全文
71 5 打赏 收藏 转发到动态 举报
写回复
用AI写文章
5 条回复
切换为时间正序
请发表友善的回复…
发表回复
xiaoyisnail 2009-01-09
  • 打赏
  • 举报
回复
up
kingsun555 2009-01-09
  • 打赏
  • 举报
回复
Ls的,我要知道能如何确保数据读完,还来问问题干吗? 
独孤过儿 2009-01-09
  • 打赏
  • 举报
回复
建议看下《Unix Network Programming》,把read()函数按照书中那样重新封装一下,以确保能够读取完数据
  • 打赏
  • 举报
回复
引用 5 楼 kingsun555 的回复:
引用 3 楼 hairetz 的回复:
给你的建议是,每次read完后返回到int ret = select( maxfd+1, &read_set, 0, 0, 0 ) ; 去掉里面那个while,不需要一次接收完所有数据,在每次数据要发送完的时候,在数据结尾加些特殊的数据作为结束标识符号,在接收段,自己把数据组起来。


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

你的服务器必须得作出标识啊,不然,人家客户端怎么知道结束。只是看标识得办法有简单的,有复杂的而已
独孤过儿 2009-01-09
  • 打赏
  • 举报
回复
大哥你就不能自己找书看下吗...

我还把代码给你贴出来啊?

64,637

社区成员

发帖
与我相关
我的任务
社区描述
C++ 语言相关问题讨论,技术干货分享,前沿动态等
c++ 技术论坛(原bbs)
社区管理员
  • C++ 语言社区
  • encoderlee
  • paschen
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
  1. 请不要发布与C++技术无关的贴子
  2. 请不要发布与技术无关的招聘、广告的帖子
  3. 请尽可能的描述清楚你的问题,如果涉及到代码请尽可能的格式化一下

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