免费注册 查看新帖 |

Chinaunix

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

关于连接的UDP套接口 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2010-10-04 00:21 |只看该作者 |倒序浏览
对于连接的UDP套接口,异步错误会返回给进程, 可是为什么还是堵塞在read上没返回呢?
  1. #include <stdlib.h>
  2. #include <stdio.h>
  3. #include <strings.h>
  4. #include <string.h>
  5. #include <unistd.h>
  6. #include <netinet/in.h>
  7. #include <arpa/inet.h>
  8. #include <errno.h>
  9. #define SER_PORT 9877
  10. #define MAXLINE 4096

  11. void dg_cli(FILE *fp, int sockfd, const struct sockaddr *pservaddr, socklen_t servlen)
  12. {
  13.     int n;
  14.     char sendline[MAXLINE], recvline[MAXLINE+1];

  15.     if(connect(sockfd, (struct sockaddr*)pservaddr, servlen) != 0)    {
  16.         printf("connect error: %s\n", strerror(errno));
  17.         exit(1);
  18.     }
  19.     while(fgets(sendline, MAXLINE, fp) != NULL) {
  20.         n = strlen(sendline);      
  21.         if(write(sockfd, sendline, strlen(sendline)) != n) {
  22.             printf("write error : %s", strerror(errno));
  23.             exit(1);
  24.         }
  25.         
  26.         n = read(sockfd, recvline, MAXLINE);    //在这里没有返回错误
  27.         if(n < 0)
  28.             printf("read error : %s", strerror(errno));
  29.         printf("after   n %d\n", n);
  30.         recvline[n] = 0;
  31.         fputs(recvline, stdout);
  32.     }
  33. }

  34. int main()
  35. {
  36.     int sockfd;
  37.     struct sockaddr_in servaddr;

  38.     bzero(&servaddr, sizeof(servaddr));
  39.     servaddr.sin_family = AF_INET;
  40.     inet_pton(AF_INET, "192.168.1.2", (void*)&servaddr.sin_addr);
  41.     servaddr.sin_port = htons(SER_PORT);

  42.     sockfd = socket(AF_INET, SOCK_DGRAM, 0);

  43.     dg_cli(stdin, sockfd,(struct sockaddr*)&servaddr, sizeof(servaddr));
  44.    
  45.     return 0;
  46. }
复制代码

论坛徽章:
0
2 [报告]
发表于 2010-10-06 21:09 |只看该作者
因为你的套接字设置为阻塞的,若想让read系统调用不阻塞的话,可以用setsockopt来进行设置,不过这非阻塞的处理起来可能会比较复杂一点。

论坛徽章:
0
3 [报告]
发表于 2010-10-12 14:24 |只看该作者
这个很像unix网络编程上的例子,可以加一个poll或者select,超时处理,应该就不会一直阻塞了。。。
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP