求助:LINUX 网络编程的一个问题
这个程序是一个会话式的客户端,程序从标准输入接收到命令通过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 ) ;
}
//如何从这个循环跳出,返回到主循环,是个问题,没有办法判断数据刚好读完。
}
}
}
有什么好的办法使得能够容易判断一个命令的返回结果读取完毕(长度指示是不行的,不能够改其他服务器程序的代码)?谢谢各位先!