免费注册 查看新帖 |

Chinaunix

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

读写socket描述符过程中调用system()会中断连接? [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2011-11-17 19:56 |只看该作者 |倒序浏览
  1. #include <stdio.h>
  2. #include <stdlib.h>
  3. #include <string.h>
  4. #include <sys/socket.h>
  5. #include <netinet/in.h>
  6. #include <sys/mman.h>
  7. #include <fcntl.h>

  8. #define MAXLINE                80
  9. #define SERV_PORT        8000

  10. int
  11. main(int argc, char *argv[])
  12. {
  13.         struct sockaddr_in        servaddr, cliaddr;
  14.         socklen_t                cliaddr_len;
  15.         int                        listenfd, connfd;
  16.         char                        buf[MAXLINE];
  17.         char                        str[INET_ADDRSTRLEN];
  18.         int                        i, n;

  19.         listenfd = socket(AF_INET, SOCK_STREAM, 0);
  20.         if (listenfd == -1) {
  21.                 perror("socket");       
  22.                 exit(1);
  23.         }

  24.         bzero(&servaddr, sizeof(servaddr));
  25.         servaddr.sin_family = AF_INET;
  26.         servaddr.sin_port = htons(SERV_PORT);
  27.         servaddr.sin_addr.s_addr = htonl(INADDR_ANY);
  28.         if (bind(listenfd, (struct sockaddr *)&servaddr, sizeof(servaddr)) == -1) {
  29.                 perror("bind");       
  30.                 exit(1);
  31.         }

  32.         if (listen(listenfd, 20) == -1) {
  33.                 perror("listen");       
  34.                 exit(1);
  35.         }

  36.         printf("Accepting connections ...\n");
  37.         while (1) {
  38.                 cliaddr_len = sizeof(cliaddr);
  39.                 connfd = accept(listenfd, (struct sockaddr *)&cliaddr, &cliaddr_len);
  40.                 if (connfd == -1) {
  41.                         perror("accept");       
  42.                         exit(1);
  43.                 }

  44.                 n = read(connfd, buf, MAXLINE);

  45.                 for (i = 0; i < n; i++)
  46.                         buf[i] = toupper(buf[i]);
  47.                 system("ls");
  48.                 write(connfd, buf, n);
  49.                             [color=Red]system("ls");[/color]
  50.                 write(connfd, "@", 1);
  51.                 write(connfd, "stopping@", 9);

  52.                 close(connfd);
  53.         }

  54.         exit(0);
  55. }
复制代码
有时候会中断连接,有时候client收到的信息会不全。是因为system()会fork+exec吗?那又想在socket其中执行一条命令该怎么做呢?问题比较弱,请各位指点一二。

论坛徽章:
0
2 [报告]
发表于 2011-11-17 22:44 |只看该作者
你把客户端的代码也贴上

论坛徽章:
0
3 [报告]
发表于 2011-11-17 22:51 |只看该作者
include 都没有 include 全啊

论坛徽章:
0
4 [报告]
发表于 2011-11-18 08:38 |只看该作者
你把客户端的代码也贴上
caiyijun1987 发表于 2011-11-17 22:44
  1. #include <stdio.h>
  2. #include <stdlib.h>
  3. #include <string.h>
  4. #include <unistd.h>
  5. #include <sys/socket.h>
  6. #include <netinet/in.h>
  7. #include <fcntl.h>

  8. #define MAXLINE                80
  9. #define SERV_PORT        8000

  10. int
  11. main(int argc, char *argv[])
  12. {
  13.         struct sockaddr_in        servaddr;
  14.         int                        sockfd;
  15.         char                        buf[MAXLINE];       
  16.         int                        n;

  17.         if (argc != 2) {
  18.                 fprintf(stderr, "Usage: %s message\n", argv[0]);       
  19.                 exit(1);
  20.         }

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

  26.         bzero(&servaddr, sizeof(servaddr));
  27.         servaddr.sin_family = AF_INET;
  28.         servaddr.sin_port = htons(SERV_PORT);
  29.         inet_pton(AF_INET, "127.0.0.1", &servaddr.sin_addr);
  30.         if (connect(sockfd, (struct sockaddr *)&servaddr, sizeof(servaddr)) == -1) {
  31.                 perror("connect");       
  32.                 exit(1);
  33.         }

  34.         write(sockfd, argv[1], strlen(argv[1]));
  35.         n = read(sockfd, buf, MAXLINE);
  36.         printf("Response from server:\n");
  37.         write(STDOUT_FILENO, buf, n);
  38.         close(sockfd);

  39.         exit(0);
  40. }
复制代码

论坛徽章:
11
未羊
日期:2013-12-16 12:45:4615-16赛季CBA联赛之青岛
日期:2016-04-11 19:17:4715-16赛季CBA联赛之广夏
日期:2016-04-06 16:34:012015亚冠之卡尔希纳萨夫
日期:2015-11-10 10:04:522015亚冠之大阪钢巴
日期:2015-07-30 18:29:402015亚冠之城南
日期:2015-06-15 17:56:392015亚冠之卡尔希纳萨夫
日期:2015-05-15 15:19:272015亚冠之山东鲁能
日期:2015-05-14 12:38:13金牛座
日期:2014-12-04 15:34:06子鼠
日期:2014-10-16 13:40:4715-16赛季CBA联赛之八一
日期:2016-07-22 09:41:40
5 [报告]
发表于 2011-11-18 10:18 |只看该作者
和system 无关, read 不保证读完

论坛徽章:
0
6 [报告]
发表于 2011-11-18 11:36 |只看该作者
和system 无关, read 不保证读完
zylthinking 发表于 2011-11-18 10:18



一般read都是自己写函数吧,比如readn并判断errno,是不是这样~~

论坛徽章:
11
未羊
日期:2013-12-16 12:45:4615-16赛季CBA联赛之青岛
日期:2016-04-11 19:17:4715-16赛季CBA联赛之广夏
日期:2016-04-06 16:34:012015亚冠之卡尔希纳萨夫
日期:2015-11-10 10:04:522015亚冠之大阪钢巴
日期:2015-07-30 18:29:402015亚冠之城南
日期:2015-06-15 17:56:392015亚冠之卡尔希纳萨夫
日期:2015-05-15 15:19:272015亚冠之山东鲁能
日期:2015-05-14 12:38:13金牛座
日期:2014-12-04 15:34:06子鼠
日期:2014-10-16 13:40:4715-16赛季CBA联赛之八一
日期:2016-07-22 09:41:40
7 [报告]
发表于 2011-11-18 11:42 |只看该作者
差不多
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP