LinuxSir.cn,穿越时空的Linuxsir!

 找回密码
 注册
搜索
热搜: shell linux mysql
查看: 872|回复: 5

一个网络数据传输问题

[复制链接]
发表于 2003-7-30 16:17:20 | 显示全部楼层 |阅读模式
程序为C/S结构,客户端发送命令到服务器端,比如一个shell命令,命令在服务器端执行,将得到的信息通过socket发送到客户端进行输出。
请问:
1、服务器端执行shell命令的方法通常有那些?
2、将信息写入socket通常怎么实现?
发表于 2003-7-30 16:55:38 | 显示全部楼层
1.根据你的问题,估计要用pipe、fork、exec或popen
2.write
 楼主| 发表于 2003-7-30 17:17:46 | 显示全部楼层
能告诉我大致应该怎么去实现吗?
谢谢了!
(不希望使用重定向符写如果一个文件,然后从文件中读出到socket,而希望直接能写如socket中)
发表于 2003-7-30 18:49:55 | 显示全部楼层

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

  9. int
  10. main(void)
  11. {
  12.   int sockfd, fd;
  13.   struct sockaddr_in saddr, caddr;
  14.   int n, addr_size;
  15.   char buf[1024];
  16.   FILE *fp;
  17.   extern int errno;

  18.   if((sockfd = socket(AF_INET, SOCK_STREAM, 0)) == -1){
  19.     perror("socket error");
  20.     exit(-1);
  21.   }
  22.   bzero(&saddr, sizeof(saddr));
  23.   saddr.sin_family = AF_INET;
  24.   saddr.sin_port = htons(12345);
  25.   saddr.sin_addr.s_addr = htonl(INADDR_ANY);
  26.   if(bind(sockfd, (struct sockaddr *)&saddr, sizeof(struct sockaddr)) == -1){
  27.     perror("bind error");
  28.     exit(-1);
  29.   }
  30.   if(listen(sockfd, 1) == -1){
  31.     perror("listen error");
  32.     exit(-1);
  33.   }
  34.   for(;;){
  35.     addr_size = sizeof(struct sockaddr_in);
  36.     if((fd = accept(sockfd, (struct sockaddr *)&caddr, &addr_size)) == -1){
  37.       perror("accept error");
  38.       continue;
  39.     }
  40.     for(;;){
  41.       if((n = read(fd, buf, 1023)) < 0){
  42.         perror("read error");
  43.         continue;
  44.       }
  45.       buf[n - 2] = '\0'; /* 去除/r/n */
  46.       if(!strcasecmp(buf, "exit"))
  47.         break;
  48.       if((fp = popen(buf, "r")) == NULL){
  49.         snprintf(buf, 1023, "ERROR: %s", strerror(errno));
  50.         write(fd, buf, strlen(buf));
  51.         continue;
  52.       }
  53.       while(fgets(buf, 1023, fp))
  54.         write(fd, buf, strlen(buf));
  55.       pclose(fp);
  56.     }
  57.     close(fd);
  58.   }
  59.   exit(0);
  60. }
复制代码

用telnet localhost 12345连接。
只能返回stdout的输出,对stderr的输出是在服务器端输出的,输入的命令不能是交互式的。
发表于 2003-7-31 00:16:50 | 显示全部楼层
完整的实现可以去参考telnet的源代码。
 楼主| 发表于 2003-7-31 09:23:14 | 显示全部楼层
好的谢谢各位了,我自己去看看,如果还有什么不明白的在来请教
您需要登录后才可以回帖 登录 | 注册

本版积分规则

快速回复 返回顶部 返回列表