免费注册 查看新帖 |

Chinaunix

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

[C] 一个简单的C语言Socket编程问题。 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2012-07-30 16:54 |只看该作者 |倒序浏览
  1. int main()
  2. {
  3.         int n=0;
  4.         long i=0;
  5.         int listenfd,connfd;
  6.         struct sockaddr_in servaddr;
  7.         char buff[MAXLINE];

  8.         listenfd=socket(AF_INET,SOCK_STREAM,0);

  9.         bzero(&servaddr,sizeof(servaddr));

  10.         servaddr.sin_family=AF_INET;
  11.         servaddr.sin_addr.s_addr=htonl(INADDR_ANY);
  12.         servaddr.sin_port=htons(10001);
  13.         bind(listenfd,(SA*)&servaddr,sizeof(servaddr));

  14.         listen(listenfd,LISTENQ);
  15.         for(;;)
  16.         {
  17.                 connfd=accept(listenfd,(SA *)NULL,NULL);
  18.                 while(1)
  19.                 {
  20.                         n=read(connfd,buff,MAXLINE);
  21.                         printf("%d:the number of read is %d\n",i,n);
  22.                         i++;
  23.                 }
  24.         }
  25.         return 0;
  26. }
复制代码
最基础的SOcket编程服务器端程序,在Linux上运行,我在另一台Windows主机上运行 TCP/UNP调试工具建立客户端连接,在客户端上可以正常的发送数据,但是我断开客户端后,服务器程序就不断的执行 read()这条语句,并且返回得到的字符数是0.
为什么会发生这种情况呢?当没有数据可读的时候read不是应该被堵塞的吗? 如果是因为connfd不存在造成的,那我应该怎么检测来避免这个问题发生呢?

论坛徽章:
0
2 [报告]
发表于 2012-07-30 21:40 |只看该作者
read一个已关闭了的套接字会返回 0
既然套接字已关闭,那就break出内层循环    accept阻塞等待新的连接即可。

论坛徽章:
0
3 [报告]
发表于 2012-07-31 09:17 |只看该作者
回复 2# Moon_Bird
谢谢~但是有另外一个问题,此时read返回0的时候,一定是读到一个已经关闭的fd吗?不会是其它情况导致的返回0吗?


   

论坛徽章:
0
4 [报告]
发表于 2012-07-31 09:26 |只看该作者
@snan4love
读到 EOF , 具体可 man read
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP