多并发原理如图,多个客户端连接一个服务器,无论哪个客户端发送数据给服务器,服务器都能把数据准确的返回给这个客户端。

在socket编程中,socket这种文件描述符被默认设置为阻塞,故而read函数和accept函数时阻塞函数,read函数只有从缓冲区读到数据了才返回,否则一直等待,程序一直卡在这个位置;accept函数只要有客户端连接到服务器就返回,否则一直等待,程序一直卡在这个位置。就很容易出现能发数据但连不上其他客户端或者只能连不能发数据的问题,为避免这种情况的发生,就需要程序同时检测有没有客户端连接和读取缓冲区数据,这里我们就以多进程的方式来实现多并发。父进程用于连接客户端,只要有客户端连接就创建一个进程,用于与服务器通信。

服务器

#include <sys/socket.h>
#include <unistd.h>
#include <arpa/inet.h>
#include <stdio.h>
#include <string.h>
#include <netinet/in.h>
#include <sys/types.h>void do_work(int client_sock,char *ip_addr)
{char arr[100]={0};while(1){memset(arr,0,sizeof(arr));int ret=read(client_sock,arr,sizeof(arr));//当客户端关闭,read函数立即返回0if(ret==0){printf("%s  客户机已关闭\n",ip_addr);break;}printf("%s  :",ip_addr);fputs(arr,stdout);write(client_sock,arr,ret);}
}int inter()
{int client_sock=0;struct sockaddr_in sock;memset(&sock,0,sizeof(sock));sock.sin_family=AF_INET;sock.sin_port=htons(5188);sock.sin_addr.s_addr=htonl(INADDR_ANY);int sockid=socket(AF_INET,SOCK_STREAM,IPPROTO_TCP);const int on=1;if(setsockopt(sockid,SOL_SOCKET,SO_REUSEADDR,&on,sizeof(on))<0)//设置端口可重复利用{printf("setsockopt\n");return 0;}if(bind(sockid,(struct sockaddr *)&sock,sizeof(sock))<0){printf("bind\n");return 0;}if(listen(sockid,SOMAXCONN)<0){printf("listen\n");return 0;}struct sockaddr_in other_sock;socklen_t other_socklen=sizeof(other_sock);pid_t pid=0,son_pid=0;while(1){client_sock=accept(sockid,(struct sockaddr *)&other_sock,&other_socklen);//父进程处理与客户端的连接if(client_sock<0){printf("accept\n");return 0;}char *ip_addr=inet_ntoa(other_sock.sin_addr);printf("ip=%s  已连接\n",ip_addr);pid=fork();//只要有客户端与服务器连接就创建一个进程if(pid==0)//子进程{close(sockid);//子进程不用sockid需要将其关闭do_work(client_sock,ip_addr);//子进程用于处理与客户端的收发数据操作break;}else//父进程{close(client_sock);//父进程不用client_sock需要将其关闭}}close(sockid);return 0;
}int main()
{inter();return 0;
}

客户端

#include <stdio.h>
#include <string.h>
#include <unistd.h>
#include <sys/socket.h>
#include <netinet/in.h>int main()
{struct sockaddr_in sock;memset(&sock,0,sizeof(sock));sock.sin_family=AF_INET;sock.sin_port=htons(5188);sock.sin_addr.s_addr=inet_addr("127.0.0.1");int sockid=socket(PF_INET,SOCK_STREAM,IPPROTO_TCP);socklen_t socklen=sizeof(sock);if(connect(sockid,(struct sockaddr *)&sock,socklen)<0){printf("connect\n");return 0;}char send[100]={0};char arr[100]={0};while(1) {fgets(send,sizeof(send),stdin);//从标准输入获取数据write(sockid,send,strlen(send));if(strcmp(send,"NULL\n")==0)//输入NULL退出客户端{break;}read(sockid,arr,sizeof(arr));fputs(arr,stdout);memset(arr,0,strlen(arr));memset(send,0,strlen(send));}close(sockid);return 0;
}

多线程方式请点此处

linux——回射服务器多并发(多进程)相关推荐

  1. Linux——回射服务器多并发(多线程)

    多线程与多进程的做法区别不大,思路一样,都是执行两个死循环,一个循环等待客户端连接,一个循环与客户端通信.多进程的方式请点此处 服务器 #include <sys/socket.h> #i ...

  2. linux——回射服务器

    回射服务器即客户端发送一段数据给服务器,服务器再将这段数据原封不动的发送给客户端,原理很简单,原理图如下: 以TCP协议为例,客户端.服务器代码如下: ** 服务器: ** #include < ...

  3. Linux C++ 回射服务器

    http://blog.csdn.net/qq_25425023/article/details/53914820 回射服务器就是服务端将客户端的数据发送回去. 我实现的回射服务器返回增加了时间. 服 ...

  4. 一个简单的回射服务器

    本文编写了一个初步的简单的回射服务器例子.基本内容书上都能找到,认真看书就行了,所以尽量讲一些自己认为应该注意的地方. 功能: 客户端从标准输入读入一行文本,写给服务器:服务器读入这行文本,并回射给客 ...

  5. LIBUV学习笔记(三)libuv中pipe/tty相关操作以及一个简单的unix域回射服务器/客户端例子...

    uv_pipe_t - Pipe handle Pipe handles provide an abstraction over local domain sockets on Unix and na ...

  6. 《UNP》随笔——“实现一个简单的回射服务器”存在的不足(信号处理)

    尽管实现了一个简单的回射服务器,但依旧存在一些不足: 服务端的子进程结束的时候,由于父进程未对子进程发送的SIGCHLD信号进行处理,会导致子进程进入僵死状态.这一点该如何解决? 客户端A向服务端B发 ...

  7. TCP echo_server(C++)回射服务器实现以及问题记录

    TCP echo_server(C++)回射服务器实现以及问题记录 基本运行方式: 客户端接收用户输入的字符串并发送到服务器端 服务器端将接收的字符串数据传回客户端 服务器端和客户端之间的字符串回射一 ...

  8. UNIX TCP回射服务器/客户端之使用epoll模型的服务器

    程序简介:这是一个运用epoll系列函数进行IO复用的服务器模型.它是目前UNIX与LINUX平台上效率最高,最受欢迎的IO复用传输模型. 其他的不说了,直接粘贴代码吧! 服务器端: #include ...

  9. UNIX网络编程——UDP回射服务器程序(初级版本)以及漏洞分析

    该函数提供的是一个迭代服务器,而不是像TCP服务器那样可以提供一个并发服务器.其中没有对fork的调用,因此单个服务器进程就得处理所有客户.一般来说,大多数TCP服务器是并发的,而大多数UDP服务器是 ...

最新文章

  1. 电子学会青少年编程等级考试Python一级题目解析03
  2. 用户变量和系统变量的区别
  3. 【图灵】iOS技能书单——入门+进阶+精通
  4. linux vnc的小黑点和鼠标不同步_vnc连接windows,推荐三款非常好用的vnc连接windows软件...
  5. C++ Primer 5th笔记(chap 19 特殊工具与技术)成员函数指针
  6. 剑指 Offer 22. 链表中倒数第k个节点(C语言)
  7. JSP+JavaBean+Servlet技术(MVC模型)
  8. ERROR 1366 (HY000): Incorrect string value......(Mysql报错解决)
  9. vue 判断页面加载完成_在Vue+webpack中详细讲解基础配置
  10. 获得有向无环图中起点到终点的所有路径_力扣1514——概率最大的路径
  11. 评审恩仇录——我为什么愿意执行代码评审
  12. mysql rsync复制,mysql复制又同步
  13. arm指令集 c语言,这些Cortex-A处理器支持的指令集,您都知道吗?
  14. 2019最新易桥(HttpPrinter) web打印控件完整版版|HttpPrinter web打印控件下载
  15. redis 默认过期策略_redis 过期策略
  16. 超实用的容器镜像漏洞检测工具 Trivy 入门指南
  17. 【每日英文】2021.9.23
  18. 首届百度Apollo生态大会为什么选择长沙?
  19. 区块链行业薪酬待遇,与事实相符吗?
  20. 强烈推荐几个超厉害的公众号!

热门文章

  1. 捧上天的AI落地困难,“ 不懂变通”的华为云如何应付?
  2. 区间DP初探 P1880 [NOI1995]石子合并
  3. JS中调用bignumber处理高精度小数运算
  4. Exchange_Server_2013在Windows_2008_R2部署
  5. [精讲-3]Offline Domain Join
  6. USB peripherals can turn against their users
  7. 创建索引的方法有两种
  8. 二鸟在林不如一鸟在手
  9. 基于AgileEAS.NET企业应用平台实现基于SOA架构的应用整合方案-开篇
  10. FileSystemObject和Folders使用详细介绍