- 论坛徽章:
- 0
|
本帖最后由 hsum 于 2010-06-02 21:22 编辑
更新2:
问题原因查明了,服务端其实是正确的,每次write()后都传送了消息给客户端,问题在于服务端write()的间隔时间很短,客户端来不及从接收缓冲区读取这一次的信息,服务端就又发送了信息过来,这样客户端一次读取的就很可能是服务端多次发送来的信息了,只要在客户端调用sleep(),延时下,就很容易证明这个原因。。。。
现在想想看怎么解决这个问题呢
更新:
现在的问题是这样,我的需求是:客户端发送一个字符串给服务端,write(sockfd,string,strlen(string)),服务端接收到字符串后作出一些处理,这个处理过程中有一些输出,从一行至多行不等,需要返回给客户端,在客户端上显示.
我的客户端发送和接受是这么写的:
- char send[MAX_COMMAND];
- char receive[MAX_COMMAND];
- while(1){
- bzero(send,MAX_COMMAND);
- bzero(receive,MAX_COMMAND);
-
- printf("$:");
- fgets(send,MAX_COMMAND,stdin); // 获得输入的字符串
- send[strlen(send)]='\n';
- write(sockfd,send,strlen(send)); //发送给服务端
- while(1){
- bzero(receive,1024);
- if((n=read(sockfd,receive,MAX_COMMAND))<=0){ //如果读取的字符数小于0,判断是否是因为缓冲区问题
- if(errno==EINTR)
- continue;
- else
- break;
- }
- if(!strcmp(receive,"\n\n\n")) //如果服务端发送过来三个回车,说明本次发送完毕,跳出循环
- break;
- printf("%s",receive); //打印本次返回的结果
- }
- }
复制代码 服务端的代码:
- .......接受到客户端的指令,并调用相应函数,下面是相应函数中的内容
- char newline[1024];
- bzero(newline,1024);
-
- sprintf(newline,"aaaaaaaaa \n");
- write(sockfd,newline,strlen(newline));
- // sleep(2);
- .....都是这种输出格式
- sprintf(newline,"zzzzzzzzzz \n");
- write(sockfd,newline,strlen(newline));
- // sleep(2);
- strcpy(newline,"\n\n\n"); //最后发送三个回车,代表本次返回完毕
- write(sockfd,newline,strlen(newline));
复制代码 问题就在这,并不是每次服务端碰到write(),客户端都输出相应内容,而是客户端一次接收到多个服务端的write内容(我在客户端通过read返回的字节数判断的),所以服务端最后代表结束的三个回车一同添加在前面的输出结果后面了,致使客户端不能接收到单独的三个回车,但奇怪的是,我在服务端每次调用完write()后,调用sleep(),这样就可以像我期望的那样了,服务端调用一次write(),便发送给客户断,客户端便接收到信息(通过客户端read返回的字节数),客户端也能正确识别最后三个回车了,这是为什么呢?
------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
最近的项目中用到客户端服务端,linux环境下c,第一次接触socket编程,一边在看<unix网络编程>,一边在写代码
客户端发送一条字符串给客户端(已经实现)
服务端接收到字符串后经过处理,产生结果,几行至几十行不等,需要回送给客户端显示,
我的方法是在服务端记录接收到的套接字socketfd,然后传入所有有输入的函数,这些函数原来是直接printf()输入,现在改为:
sprintf(string,"""); //先将输出存在一个字符串数组string中
write(socketfd,string,strlen(string)); //再将string输出到这个套接字中
问题:
有的输出很短,一行不到,几十个字符,客户端能够正常接收到并显示。
可是有的输入很长,10多行,几百个字符串,客户端不能正常显示,不如客户端输入命令a后,只显示了应有结果的一行,再随便输入一个命令或者回车,其余的十几行就显示出来了。
很奇怪,感觉是缓冲区的问题,但不晓得怎么搞,请指教!谢谢! |
|