此博客仅用于记录个人学习进度,学识浅薄,若有错误观点欢迎评论区指出。欢迎各位前来交流。(部分材料来源网络,若有侵权,立即删除)
本人博客所有文章纯属学习之用,不涉及商业利益。不合适引用,自当删除!
若被用于非法行为,与我本人无关

基于C语言

  • 代码
    • 服务端
    • 客户端
  • 运行效果

代码

服务端

#include<stdio.h>
#include<unistd.h>
#include<sys/socket.h>
#include<string.h>
#include<netdb.h>
#include<netinet/in.h>
#include<arpa/inet.h>
#include<sys/socket.h>
#define PORT 8900
#define BUF_SIZE 2048
#include<stdlib.h>int execute(char* command,char* buf);int main()
{int sockfd;struct sockaddr_in client;struct sockaddr_in server;char send_buf[BUF_SIZE];char recv_buf[BUF_SIZE];char cmd[4096];int sendnum;int recvnum;int length;int port;int connected;memset(send_buf,0,2048);memset(recv_buf,0,2048);memset(cmd,0,4096);port = PORT;if (-1==(sockfd=socket(AF_INET,SOCK_STREAM,0)))  //change{perror("[error]:socket connect failed\n");exit(1);}memset(&server,0,sizeof(struct sockaddr_in));server.sin_family = AF_INET;server.sin_addr.s_addr = htonl(INADDR_ANY);server.sin_port = htons(port);if (-1==bind(sockfd,(struct sockaddr*)&server,sizeof(struct sockaddr))){perror("[error]:binding\n");close(sockfd);exit(1);}if(-1==listen(sockfd,10)){perror("[error]:listien\n");close(sockfd);return -1;}length = sizeof(struct sockaddr_in);while(1){memset(recv_buf,0,2048);memset(send_buf,0,2048);if(-1==(connected=accept(sockfd,(struct sockaddr*)&client,&length))){perror("[error]:three shakehands\n");close(sockfd);return -1;}//change///int pid = fork();if((pid=fork())<0){printf("fork failed\n");_exit(1);}else if(pid == 0){process(connected, client);}else{close(connected);continue;}close(connected);}close(sockfd);exit(1);
}int process(int connected, struct sockaddr_in client)
{char sendbuf[BUF_SIZE];char recvbuf[BUF_SIZE];int sendnum = 0;int recvnum = 0;int cnt;int n, fd[2];int length = sizeof(struct sockaddr_in);char cmd[10];char path[2048];pid_t pid;memset(sendbuf, 0, BUF_SIZE);memset(recvbuf, 0, BUF_SIZE);if(pipe(fd)<0)printf("[error]:creat pipe  \n");while(1){if(0>=(recvnum=recv(connected, recvbuf, BUF_SIZE, 0))){perror("[error]:recv\n");close(connected);return -1;}recvbuf[recvnum]='\0';printf("子进程pid:%d \n父进程pid:%d\n连接描述符:%d\n",getpid(),getppid(),connected);fprintf(stderr, "the command is:%s\n", recvbuf);if(0==strcmp(recvbuf, "quit")){perror("quitting remote controling\n");close(connected);return 0;   }strcpy(cmd,"/bin/");strcat(cmd,recvbuf);execute(cmd,sendbuf);if ('\0'==*sendbuf){memset(cmd,0,sizeof(cmd));strcpy(cmd,"/sbin/");strcat(cmd,recvbuf);execute(cmd,sendbuf);if ('\0'==*sendbuf){       memset(cmd,0,sizeof(cmd));strcpy(cmd,"/usr/bin/");strcat(cmd,recvbuf);execute(cmd,sendbuf);}if ('\0'==*sendbuf){       memset(cmd,0,sizeof(cmd));strcpy(cmd,"/usr/sbin/");strcat(cmd,recvbuf);execute(cmd,sendbuf);}}if ('\0'==*sendbuf)sprintf(sendbuf,"command is not vaild,check it please\n");printf("%s\n",sendbuf);sendnum = send(connected,sendbuf,sizeof(sendbuf),0);if (0>sendnum){perror("sending data error\n");continue;}}
}int execute(char* command,char* buf)
{FILE *     fp;int count;if (NULL==(fp = popen(command,"r"))){perror("[error]:creating pipe\n");exit(1);}count = 0 ;while(((buf[count] = fgetc(fp))!=EOF)&&count<2047)count++;buf[count]='\0';pclose(fp);if(0==count)   //changeprintf(buf, "%s cannot execute\n",command);return count;
}

客户端

#include<stdio.h>
#include<unistd.h>
#include<sys/socket.h>
#include<string.h>
#include<netdb.h>
#include<netinet/in.h>
#include<arpa/inet.h>
#define PORT 8900
#define BUF_SIZE 2048void print_usage(char* str)
{printf("%s usage :\n",str);printf("%s Ipaddr \n");
}
int main(int argc, char** argv)
{int sockfd;struct sockaddr_in client;struct sockaddr_in server;char send_buf[BUF_SIZE];char recv_buf[BUF_SIZE];  int sendnum;int recvnum;int length;int port;if(2!=argc){print_usage(argv[0]);exit(1);    }memset(send_buf,0,2048);memset(recv_buf,0,2048);port = PORT;if (-1==(sockfd=socket(AF_INET,SOCK_STREAM,0)))  // change{perror("generating socket error\n");exit(1);} memset(&server,0,sizeof(struct sockaddr_in));    //changeserver.sin_family = AF_INET;server.sin_addr.s_addr = inet_addr(argv[1]);server.sin_port = htons(port);if(-1==connect(sockfd, (struct sockaddr*)&server, sizeof(server)))  //change{perror("connect error\n");close(sockfd);return -1;}while(1)memset(send_buf,0,2048);memset(recv_buf,0,2048);printf("tcp>");   //changegets(send_buf);  //change   Don't use 'fgets'!!!!!!!!!!!!printf("\n");if (0>send(sockfd,send_buf,strlen(send_buf),0))  //change{perror("error occar in sending data\n");break;}if (0==strcmp(send_buf,"quit")){printf("quit...\n");     //changebreak;}length = sizeof(struct sockaddr);recvnum = recv(sockfd,recv_buf,2048,0);if(0<recvnum)                          //change{recv_buf[recvnum]='\0';printf("%s\n",recv_buf);}else{continue;}//printf("%s\n",recv_buf);}close(sockfd);exit(1);
}

运行效果

  • 分别执行三个客户端进程:


  • 查看服务器输出情况:
  • 查看进程结束前后变化:

从入门到入土:基于C语言实现并发Web服务器|父进程子进程|代码展示相关推荐

  1. 项目--基于http协议的小型web服务器

    在我们对网络的学习过程中,会接触到网络编程,我们在网络中可以深刻认识到服务器与客户端的交互,当我们输入网址时背后发生的一系列后端操作,为了加深我们对网络部分的学习,我们找到了一个开源项目TinyWeb ...

  2. 如何用C语言写一个web服务器的基础功能

    我们都知道,学一门语言,只是单独看了就不写的话是很容易出现眼高手低的,所以,今天摩杜云要给大家分享的内容,就是如何用C语言写一个web服务器的基础功能,希望大家看完有所收获. 服务器架构 目标架构 以 ...

  3. linux线程池实现多线程并发,基于Linux的多线程池并发Web服务器设计-电子设计工程.PDF...

    基于Linux的多线程池并发Web服务器设计-电子设计工程.PDF 第 卷 第 期 电子设计工程 年 月 基于 的多线程池并发 服务器设计 陈 涛 任海兰 武汉邮电科学研究院 湖北 武汉 摘要 时至今 ...

  4. 基于epoll实现简单的web服务器

    1. 简介 epoll 是 Linux 平台下特有的一种 I/O 复用模型实现,于 2002 年在 Linux kernel 2.5.44 中被引入.在 epoll 之前,Unix/Linux 平台下 ...

  5. arm Linux 低成本方案,参赛作品《低成本基于ARM+Linux平台搭建web服务器的物联网学习板》...

    [报名阶段需要填写的内容] 1. 参赛者姓名(必填项): 王徕泽 2. 单位或学校名称(选填项): 徕泽电子工作室 3. 当前职务或职称(选填项): 室长 4. 参赛作品的名字(必填项): 低成本基于 ...

  6. go语言服务器代码,Go语言开发简单web服务器

    欢迎,来自IP地址为:182.103.254.107 的朋友 Go语言由于其方便的并发通信机制以及强大的网络支持,常常被用于服务器软件的开发.本文将示例使用Go语言来开发简单的Web服务器. HTTP ...

  7. 基于Docker和Golang搭建Web服务器

    1 场景描述 基于centos7的docker镜像搭建golang开发环境 在docker容器内,使用golang实现一个Web服务器 启动docker容器,并在容器内启动Web服务器 我购买了一个最 ...

  8. 基于Linux的C++轻量级web服务器/webserver/httpserver

    WebServer详解 使用C++语言,编写了一个基于Linux的HttpServer,能够实现上万的QPS. 项目地址: gitee仓库 github仓库 功能 利用I/O多路复用技术的Epoll与 ...

  9. 易语言 html 服务器,易语言模拟网页Web服务器源代码

    .版本 2 .支持库 internet .子程序 __启动窗口_创建完毕 ' 实在是无聊,做了一个WEB服务器,可以把对方的网站拿回来模拟 ' 程序运行后在IE地址栏里面打 可以发现网站 ' 如果你简 ...

最新文章

  1. strace,ltrace linux下跟踪进程调用的命令
  2. sbt1.4.4配置国内镜像源实操教程(无痛入门)
  3. leetcode(3)——414. 第三大的数(C++中的 set,::作用符号,迭代器),628 三个数的最大乘积(sort函数的用法)
  4. 我的职业梦我是学校计算机的,我院情景剧《我的航空梦》助力第四届“职业梦·技术魂”校园文化展示活动...
  5. ATC计算机会议,三项成果被计算机系统重要国际会议USENIX ATC和HotStorage收录
  6. DeepCTR-Torch,基于深度学习的CTR预测算法库
  7. 单片机 架构 程序 经验总结_单片机“死机”了怎么办?看看一个资深工程师的经验总结...
  8. 1313. 解压缩编码列表
  9. Python获取类属性及其它(vim看源码常用、__dict__)
  10. PL/SQL编程的简单学习
  11. 库克谈iPhone 12供应紧张问题;2020中国互联网百强名单:阿里、腾讯、美团分列前三;Dgraph新版发布|极客头条
  12. [Java] 蓝桥杯ADV-205 算法提高 拿糖果
  13. 学生信息管理系统优化问题汇总
  14. 软件实施工程师项目经验
  15. B2B跨境电子商务平台综合服务解决方案
  16. notepad html 自动格式化代码,notepad++格式化html代码
  17. 计算机病毒与防治说课稿,计算机病毒与防治说课稿.doc
  18. RoCEv2 无损队列缓存
  19. 精确字符串匹配(Zbox算法)
  20. 拳皇 - 人物动作素材图 61种

热门文章

  1. 【已解决】请在位于当前 Web 应用程序根目录下的“web.config”配置文件中创建一个 <customErrors> 标记
  2. 升级 卸载 ubuntu的kernel版本
  3. leetcode934.ShortestBridge
  4. asp.net中Roles和User的异常处理机制的思考
  5. JS控制图片滚动的效果
  6. linux 性能调优
  7. 只要实现了annotation这个接口就是注解 同理:只要实现了某个接口就是该类型的实现类...
  8. tornado cookie和session
  9. Android 下拉刷新上拉载入 多种应用场景 超级大放送(上)
  10. CI框架源码学习笔记7——Utf8.php