免费注册 查看新帖 |

Chinaunix

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

一个关于select的问题,百思不得其解,上来向大家求助! [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2006-10-08 15:23 |只看该作者 |倒序浏览
程序是个客户端程序,用来与聊天室服务器端通信,客户端从终端读消息,然后发过去,服务器发回处理完的消息,客户端读取处理后的消息然后显示在屏幕上。
采用的是单进程select模型,select的readset来自stdin和sockfd(与server端建立连接的套接口)。sockfd是用fdopen打开然后用
fgets函数读取的。

程序结构如下:


  1. fdin = fdopen(sockfd,"r");
  2. for(; ;)
  3.     {
  4.         FD_SET(0,&rset);
  5.         FD_SET(sockfd,&rset);
  6.         select(maxfd,&rset,NULL,NULL,NULL);

  7.         if(FD_ISSET(sockfd, &rset))
  8.         {
  9.                 while( fgets(recvline, MAXLINE, fdin) != NULL)
  10.                  {
  11.                          fprintf(stderr,"%s",recvline);//有几行打印不出来,难道阻塞在前面的select里了?
  12.                           ....
  13.                          break;//一次读取一行,处理一行,然后跳出while循环。
  14.                  }
  15.         }

  16.         if(FD_ISSET(0, &rset))
  17.         {
  18.             if( fgets(sendline,MAXLINE,stdin) == NULL)
  19.             {
  20.                 fprintf(stderr,"Quit by user!\n");
  21.                 exit(0);
  22.             }
  23.             write(sockfd, sendline, strlen(sendline));
  24.         }
  25. }
复制代码


问题是每次我只能读取到server端发送过来的一部分消息,比如说server端发过来一条消息有5行,我这只能读到3行。另外两行
要我客户端再发一条消息过去才能显示出来。而对客户端第二次发过去的消息的回应的读取也存在这个问题。

小弟我找不到问题所在,请有经验的大虾指点一下,拜谢!!!

论坛徽章:
0
2 [报告]
发表于 2006-10-08 15:37 |只看该作者
MAXLINE不够长?

论坛徽章:
0
3 [报告]
发表于 2006-10-08 15:41 |只看该作者
原帖由 逆风而行 于 2006-10-8 15:37 发表
MAXLINE不够长?

我是 #define MAXLINE 300
server端发过来的消息绝对没有超过300一行的。
还是谢谢兄弟您!

论坛徽章:
0
4 [报告]
发表于 2006-10-08 16:17 |只看该作者
在第一个fprintf那里加个 \n 试试

论坛徽章:
0
5 [报告]
发表于 2006-10-08 16:43 |只看该作者
原帖由 marco_chan 于 2006-10-8 16:17 发表
在第一个fprintf那里加个 \n 试试

stderr不是无缓冲的吗?
再说前面只要能从fgets返回,recvline里肯定就有'\n'啊。
谢谢这位兄弟!

论坛徽章:
0
6 [报告]
发表于 2006-10-08 16:47 |只看该作者
UNP有例子

论坛徽章:
0
7 [报告]
发表于 2006-10-08 16:54 |只看该作者
用read(). 然后自己解析行。

估计是buffer引起的

论坛徽章:
0
8 [报告]
发表于 2006-10-08 16:55 |只看该作者
原帖由 skai 于 2006-10-8 16:47 发表
UNP有例子

unp上高级i/o函数那章的那个例子我看了,但和这个关系不大吧?

论坛徽章:
0
9 [报告]
发表于 2006-10-08 16:59 |只看该作者
原帖由 思一克 于 2006-10-8 16:54 发表
用read(). 然后自己解析行。

估计是buffer引起的


我之所以用fgets就是因为server端每次回复的消息都是好几行文本(每行都以'\n'结尾),用fgets简单。
实在不行就要用read解析了。这样似乎麻烦了些。

论坛徽章:
0
10 [报告]
发表于 2006-10-08 17:06 |只看该作者
而且在我没用select模型之前(只是单独的发几条消息过去,而没有从终端读输入时),就能把server端发回的消息全打印出来。
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP