免费注册 查看新帖 |

Chinaunix

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

socket通信奇怪问题 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2007-03-17 16:55 |只看该作者 |倒序浏览
在编写一个socket通信程序,代码如下.c/s模式,server端建立进程向client发送5个字节的字符串eth0后退出进程,但是在client上却打印出无穷个eth0,而且在进程结束后也并没有打印出我的预设字符串:after end。冥思苦想也不知道其原因,望各位帮忙解答,谢谢!
  1. /*server*/
  2. #include <sys/time.h>
  3. #include <sys/types.h>
  4. #include <unistd.h>
  5. #include <sys/socket.h>
  6. #include <netinet/in.h>
  7. #include <arpa/inet.h>
  8. main()
  9. {struct sockaddr_in my_addr,their_addr;
  10. int sockfd;
  11. if((sockfd=socket(AF_INET,SOCK_STREAM,0))==-1){printf("error socket");exit(1);}
  12. my_addr.sin_family=AF_INET;
  13. my_addr.sin_port=htons(3999);
  14. my_addr.sin_addr.s_addr=INADDR_ANY;
  15. bzero(&(my_addr.sin_zero),8);
  16. if(bind(sockfd,(struct sockaddr *)&my_addr,sizeof(struct sockaddr))==-1)
  17. {perror("bind");exit(1);}
  18. if(listen(sockfd,10)==-1)
  19. {perror("listen");
  20. exit(1);
  21. }
  22. int new_fd,sin_size=sizeof(struct sockaddr_in);
  23. int status;
  24. pid_t pid;
  25. int num;
  26. while(1)
  27. {
  28. if((new_fd=accept(sockfd,(struct sockaddr *)&their_addr,&sin_size))==-1)
  29. {perror("accept");
  30. continue;}

  31. printf("success! connect from %s",inet_ntoa(their_addr.sin_addr));
  32. if(!(pid=fork()))
  33. {if((num=send(new_fd,"eth0",5,0))==-1) perror("send");
  34. close(new_fd);
  35. exit(0);
  36. }printf("after send");
  37. wait(&status);
  38. close(new_fd);
  39. }close(sockfd);}

  40. /*client*/
  41. #include <sys/time.h>
  42. #include <sys/types.h>
  43. #include <unistd.h>
  44. #include <sys/socket.h>
  45. #include <netinet/in.h>
  46. #include <arpa/inet.h>
  47. main(int argc,char **argv)
  48. {char buf[5];
  49. int sockfd;
  50. struct sockaddr_in their_addr;
  51. if((sockfd=socket(AF_INET,SOCK_STREAM,0))==-1) {printf("sock error");exit(1);}
  52. their_addr.sin_family=AF_INET;
  53. their_addr.sin_port=htons(3999);
  54. their_addr.sin_addr.s_addr=inet_addr(argv[1]);
  55. bzero(&(their_addr.sin_zero),8);
  56. connect(sockfd,(struct sockaddr *)&their_addr,sizeof(struct sockaddr));
  57. printf("after connect");
  58. int a;
  59. while(1)
  60. {printf("while");
  61. int a=recv(sockfd,buf,5,0);
  62. if(a<0) {close(sockfd);exit(1);}
  63. else printf("buf=%s",buf);
  64. }
  65. }
复制代码

论坛徽章:
0
2 [报告]
发表于 2007-03-17 17:07 |只看该作者
OMG,你的程序好乱撒。。。

论坛徽章:
0
3 [报告]
发表于 2007-03-17 17:10 |只看该作者
对不起了,还是麻烦各位给点意见!

论坛徽章:
0
4 [报告]
发表于 2007-03-17 18:15 |只看该作者
printf实际已经打印了,在缓冲区中
printf("after send\n")'

论坛徽章:
0
5 [报告]
发表于 2007-03-17 18:22 |只看该作者
recv一个close的描述服return 0

代码太多问题了,自己慢慢找。

论坛徽章:
0
6 [报告]
发表于 2007-03-17 18:50 |只看该作者
还请多指正 哪里还有问题 我是新手 还不太清楚 这个问题困扰我许久了 谢谢!

论坛徽章:
0
7 [报告]
发表于 2007-03-17 18:54 |只看该作者
还有问个弱点的问题 ,如flw2 所说 ,为什么printf“after send”的字符会存储在缓冲区中 ,而我们在其他程序中运用printf时一般会直接把字符输出到显示屏呢 谢谢

论坛徽章:
0
8 [报告]
发表于 2007-03-17 19:13 |只看该作者

回复 7楼 huhui_21cn 的帖子

.

stdout 常常是完全缓冲的,也可能是行缓冲的。一般地,追加一个换行符,或者数据充满缓冲区,或者程序调用 fflush(stdout),都可以让 printf() 立即输出。

.

论坛徽章:
0
9 [报告]
发表于 2007-03-17 19:25 |只看该作者
谢谢版主的解释 还有个问题 呵呵 就是在server端close socket后 在client端recv返回的是0,但是为什么在此之后 client端recv仍然返回0呢?

论坛徽章:
0
10 [报告]
发表于 2007-03-17 20:46 |只看该作者
顶一下
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP