免费注册 查看新帖 |

Chinaunix

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

菜鸟问:Linux C Socket编程的问题 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2004-05-04 21:41 |只看该作者 |倒序浏览
服务器server.c源代码如下:

  1. #include <stdio.h>;
  2. #include <stdlib.h>;
  3. #include <errno.h>;
  4. #include <string.h>;
  5. #include <sys/types.h>;
  6. #include <netinet/in.h>;
  7. #include <sys/socket.h>;
  8. #include <sys/wait.h>;
  9. #define MYPORT 3490
  10. #define BACKLOG 50

  11. main()
  12. {
  13.   int sockfd, new_fd;
  14.   struct sockaddr_in my_addr;
  15.   struct sockaddr_in their_addr;
  16.   int sin_size;

  17.   if ((sockfd = socket(AF_INET, SOCK_STREAM, 0)) == -1)
  18.   {
  19.      perror("socket");
  20.      exit(1);
  21.   }

  22.   my_addr.sin_family = AF_INET;
  23.   my_addr.sin_port = htons(MYPORT);
  24.   my_addr.sin_addr.s_addr = INADDR_ANY;
  25.   bzero(&(my_addr.sin_zero),8);

  26.   if (bind(sockfd, (struct sockaddr *)&my_addr, sizeof(struct sockaddr))== -1)
  27.   {
  28.     perror("bind");
  29.     exit(1);
  30.   }
  31.   if (listen(sockfd, BACKLOG) == -1)
  32.   {
  33.      perror("listen");
  34.      exit(1);
  35.    }

  36.    while(1)
  37.    {
  38.      sin_size = sizeof(struct sockaddr_in);
  39.      if ((new_fd = accept(sockfd, (struct sockaddr *)&their_addr, &sin_size)) == -1)
  40.      {
  41.        perror("accept");
  42.        continue;
  43.      }
  44.      printf("server: got connection from %s\n", inet_ntoa(their_addr.sin_addr));
  45.      if (!fork())
  46.      {
  47.        int numbytes=0,mycount=0;
  48.        char *buf[50];

  49.        if (send(new_fd, "Hello, world!\n", 14, 0) == -1)
  50.          perror("send");
  51.        while (1)
  52.        {
  53.          bzero(buf,sizeof(buf));
  54.          if ((numbytes=recv(new_fd, buf, 50, 0)) == -1)
  55.            perror("recv");
  56.          mycount++;
  57.          buf[numbytes]='\0';
  58.          printf("%s\n",buf);
  59.          break;
  60.        }
  61.        close(new_fd);
  62.        exit(0);
  63.      }
  64.      close(new_fd);
  65.      while(waitpid(-1,NULL,WNOHANG) >; 0);
  66.    }
  67. }
复制代码


客户端client.c的源代码如下:

  1. #include <stdio.h>;
  2. #include <stdlib.h>;
  3. #include <errno.h>;
  4. #include <string.h>;
  5. #include <sys/types.h>;
  6. #include <netinet/in.h>;
  7. #include <sys/socket.h>;
  8. #include <sys/wait.h>;

  9. #define PORT 3490
  10. #define MAXDATASIZE 102400

  11. int main(int argc, char *argv[])
  12. {
  13.    int sockfd, numbytes,i;
  14.    char buf[MAXDATASIZE];
  15.    struct sockaddr_in their_addr;

  16.    if (argc != 2)
  17.    {
  18.      fprintf(stderr,"usage: client hostname\n");
  19.      exit(1);
  20.    }

  21.    if ((sockfd = socket(AF_INET, SOCK_STREAM, 0)) == -1)
  22.    {
  23.       perror("socket");
  24.       exit(1);
  25.    }

  26.    their_addr.sin_family = AF_INET;
  27.    their_addr.sin_port = htons(PORT);
  28.    their_addr.sin_addr.s_addr=inet_addr(argv[1]);
  29.    bzero(&(their_addr.sin_zero),8);
  30.    if (connect(sockfd, (struct sockaddr *)&their_addr,sizeof(struct sockaddr)) == -1)
  31.    {
  32.       perror("connect");
  33.       exit(1);
  34.    }

  35.    char *msg="register fxdlxf 053124 fxdfbl@sohu.com";
  36.    send (sockfd,msg,strlen(msg),0);

  37.    if ((numbytes=recv(sockfd, buf, MAXDATASIZE, 0)) == -1)
  38.    {
  39.       perror("recv");
  40.       exit(1);
  41.    }

  42.    buf[numbytes] = '\0';
  43.    printf("Received: %s",buf);
  44.    close(sockfd);
  45.    return 0;
  46. }
复制代码


编译得到server和client执行文件后,我先用./server &运行 服务器程序,然后再用./client 127.0.0.1运行客户端程序,发现有时候得到的结果不尽相同!
下面是运行的结果 :

  1. root@fxdlxf:/home/fxdlxf/private/uptu_p2p# ./client 127.0.0.1
  2. server: got connection from 127.0.0.1
  3. register fxdlxf 053124 fxdfbl@sohu.com
  4. Received: Hello, world!
  5. root@fxdlxf:/home/fxdlxf/private/uptu_p2p# ./client 127.0.0.1
  6. server: got connection from 127.0.0.1
  7. register fxdlxf 053124 fxdfbl@sohu.com
  8. Received: Hello, world!
  9. root@fxdlxf:/home/fxdlxf/private/uptu_p2p# ./client 127.0.0.1
  10. server: got connection from 127.0.0.1
  11. Received: Hello, world!
  12. register fxdlxf 053124 fxdfbl@sohu.com
  13. root@fxdlxf:/home/fxdlxf/private/uptu_p2p#
复制代码

根据程序的流程,应该结果会是:
root@fxdlxf:/home/fxdlxf/private/uptu_p2p# ./client 127.0.0.1
server: got connection from 127.0.0.1
register fxdlxf 053124 fxdfbl@sohu.com
Received: Hello, world!
才对,可有时候会变成:
server: got connection from 127.0.0.1
Received: Hello, world!
register fxdlxf 053124 fxdfbl@sohu.com
两个是在同一机上同一目录下在的,大家说说是什么原因呢?
是与TCP有关?还是与SHELL进程有关?或是我的代码有问题?
感谢!

论坛徽章:
0
2 [报告]
发表于 2004-05-05 09:22 |只看该作者

菜鸟问:Linux C Socket编程的问题

代码没有问题,TCP发送与接收是有缓冲的,如果要达到你的目的的话应该额外的发送接收一些控制命令来控制顺序。

论坛徽章:
0
3 [报告]
发表于 2004-05-06 07:30 |只看该作者

菜鸟问:Linux C Socket编程的问题

没看清楚程序的请不要误导

结果很正常嘛!
你的输出来自两个进程,谁先输出谁后输出都由可能,因此顺序不能保证。

论坛徽章:
0
4 [报告]
发表于 2004-05-06 08:42 |只看该作者

菜鸟问:Linux C Socket编程的问题

原帖由 "FH" 发表:
峁?苷?B铮?
你的输出来自两个进程,谁先输出谁后输出都由可能,因此顺序不能保证。


我好像没说错吧,赫赫,吓我一跳

论坛徽章:
0
5 [报告]
发表于 2004-05-06 16:22 |只看该作者

菜鸟问:Linux C Socket编程的问题

原帖由 "FH" 发表:
峁?苷?B铮?
你的输出来自两个进程,谁先输出谁后输出都由可能,因此顺序不能保证。


把pid print出来就能说明问题了
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP