免费注册 查看新帖 |

Chinaunix

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

新手的一个程序,死活弄不明白,望解答。 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2010-03-26 22:26 |只看该作者 |倒序浏览
这是这个书上的简单C/S程序,见下面。
gcc -o sever server.c
gcc -o client client.c
运行是
./server

另外一个控制台运行
./client 127.0.0.1
原本在客户机输入字符可以返回几个字节altogether,但是现在随便输入什么并不返回,我是新手,望高手帮忙调试下,找找问题,或者给点思路,谢谢!

服务端
  1. #include <arpa/inet.h> //防止错误
  2. #include <netinet/in.h>//防止错误
  3. #include <strings.h>
  4. #include <sys/types.h>
  5. #include <sys/socket.h>
  6. #include <unistd.h>
  7. #include <stdio.h>
  8. #include <stdlib.h>
  9. //#include <Linux/in.h>
  10. #define PORT 8888
  11. #define BACKLOG 2
  12. int main(int argc, char *argv[]) {
  13.         int ss, sc;
  14.         struct sockaddr_in server_addr;
  15.         struct sockaddr_in client_addr;
  16.         int err;
  17.         pid_t pid;
  18.         ss = socket(AF_INET, SOCK_STREAM, 0);
  19.         if (ss < 0) {
  20.                 printf("Socket error \n");
  21.                 return -1;
  22.         } else {
  23.                 printf("Socket OK!\n");
  24.         }
  25.         bzero(&server_addr, sizeof(server_addr));
  26.         server_addr.sin_family = AF_INET;
  27.         server_addr.sin_addr.s_addr = htonl(INADDR_ANY);
  28.         server_addr.sin_port = htons(PORT);
  29.         err = bind(ss, (struct sockaddr*) &server_addr, sizeof(server_addr));
  30.         if (err < 0) {
  31.                 printf("Bind Error\n");
  32.         } else {
  33.                 printf("Bind OK!\n");
  34.         }
  35.         err = listen(ss, BACKLOG);
  36.         if (err < 0) {
  37.                 printf("Listen Error\n");
  38.         } else {
  39.                 printf("Listen OK! \n");
  40.         }
  41.         for(;;)
  42.         {
  43.                 int addrlen=sizeof(struct sockaddr);
  44.                 sc=accept(ss,(struct sockaddr*)&client_addr,&addrlen);
  45.                 if (sc<0){
  46.                         continue;
  47.                 }
  48.                 pid=fork();
  49.                 if (pid==0)
  50.                 {
  51.                         close(ss);
  52.                         process_conn_server(sc);

  53.                 }
  54.                 else
  55.                 {
  56.                         close(sc);
  57.                 }
  58.         }
  59.         return 0;
  60. }
  61. void process_conn_server(int s)
  62. {
  63.         ssize_t size=0;
  64.         char buffer[1024];
  65.         for (;;)
  66.                 size=read(s,buffer,1024);
  67.         if (size==0){
  68.                 return ;
  69.         }
  70.         sprintf(buffer,"%d bytes altogether \n",size);
  71.         write(s,buffer,strlen(buffer)+1);
  72. }
复制代码
客户端
  1. #include <arpa/inet.h> //防止错误
  2. #include <netinet/in.h>//防止错误
  3. #include <strings.h>
  4. #include <sys/types.h>
  5. #include <sys/socket.h>
  6. #include <unistd.h>
  7. #include <stdio.h>
  8. #include <stdlib.h>
  9. #define PORT 8888
  10. int main(int argc, char *argv[]) {
  11.         int s;
  12.         struct sockaddr_in server_addr;
  13.         int err;
  14.         s = socket(AF_INET, SOCK_STREAM, 0);
  15.         if (s < 0) {
  16.                 printf("socket error");
  17.         }else{
  18.                 printf("socket OK!");
  19.         }
  20.         bzero(&server_addr, sizeof(server_addr));
  21.         server_addr.sin_family = AF_INET;
  22.         server_addr.sin_addr.s_addr = htonl(INADDR_ANY);
  23.         server_addr.sin_port = htons(PORT);
  24.         inet_pton(AF_INET, argv[1], &server_addr.sin_addr);
  25.         connect(s, (struct sockaddr*) &server_addr, sizeof(struct sockaddr));
  26.         process_conn_client(s);
  27.         return 0;
  28. }
  29. void process_conn_client(int s) {
  30.         ssize_t size = 0;
  31.         char buffer[1024];
  32.         for (;;) {
  33.                 size = read(0, buffer, 1024);
  34.                 if (size > 0) {
  35.                         write(s, buffer, size);
  36.                         size = read(s, buffer, 1024);
  37.                         write(1, buffer, size);
  38.                 }
  39.         }
  40. }
复制代码

论坛徽章:
1
午马
日期:2013-08-23 23:39:47
2 [报告]
发表于 2010-03-26 22:54 |只看该作者
server 66,67行
  1. #         for (;;)
  2. #                 size=read(s,buffer,1024);
复制代码
死循环

导致客户端一直在等待

论坛徽章:
0
3 [报告]
发表于 2010-03-26 22:59 |只看该作者
哥哥,不好意思,我是小白。

后面不是有一句 if(size==0) renturn ;
应该能够跳出循环呀,我真的不是很明白,能否在解答下?谢谢~

论坛徽章:
1
午马
日期:2013-08-23 23:39:47
4 [报告]
发表于 2010-03-26 23:02 |只看该作者
回复 3# niuroy


    你的for语句,没用括号呃。。

论坛徽章:
0
5 [报告]
发表于 2010-03-26 23:06 |只看该作者
真是火眼金睛。
我都调试1天了,死活憋不出来。
谢谢~太感谢了!
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP