linux——回射服务器多并发(多进程)

多并发原理如图,多个客户端连接一个服务器,无论哪个客户端发送数据给服务器,服务器都能把数据准确的返回给这个客户端。
在这里插入图片描述
在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;
}

多线程方式请点此处

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/545745.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

算法图解:如何用两个栈实现一个队列?

作者 | 王磊来源 | Java中文社群&#xff08;ID&#xff1a;javacn666&#xff09;转载请联系授权&#xff08;微信ID&#xff1a;GG_Stone&#xff09;本文已收录至 https://github.com/vipstone/algorithm 《算法图解》系列。队列和栈是计算机中两个非常重要的数据结构&#…

notepad++ 偶数行_C ++程序查找前N个偶数的立方和

notepad 偶数行The problem is we have a number N and we have to find sum of first N Even natural numbers. 问题是我们有一个数N &#xff0c;我们必须找到前N个偶数自然数之和。 Example: 例&#xff1a; Input:n 3Output:288 (2^3 4^36^3)A simple solution is give…

Auto activation triggers for Java(代码提示)功能扩展

1.打开Eclipse 后“window”→“Preferences”&#xff0c;选择“java”&#xff0c;展开&#xff0c;“Editor”&#xff0c;选择“Content Assist”。2.选择“Content Assist”&#xff0c;然后看到右边&#xff0c;右边的“Auto-Activation”下面的“Auto Activation trigge…

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

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

AIGC中的视觉生成文献整理

文章目录 文件夹文献总览图像生成技术视频生成技术Video Generation with Text ConditionVideo Generation with other ConditionsVideo Editing 生成模型在其他任务上的应用扩散模型在数据标记上的应用可控的图像生成技术 文件夹文献总览 AIGC 视觉生成文献整理├── 图像生…

「递归算法」看这一篇就够了|多图

前言递归是一种非常重要的算法思想&#xff0c;无论你是前端开发&#xff0c;还是后端开发&#xff0c;都需要掌握它。在日常工作中&#xff0c;统计文件夹大小&#xff0c;解析xml文件等等&#xff0c;都需要用到递归算法。它太基础太重要了&#xff0c;这也是为什么面试的时候…

数组tostring方法_数组toString()方法以及JavaScript中的示例

数组tostring方法JavaScript toString()方法 (JavaScript toString() method) toString() method is used to convert an array to the string. It is called with the array name and returns the string containing array elements with comma separated. toString()方法用于…

JAVA解析JSON数据

在网页中想后台传递多个数据时&#xff0c;有时数据还是多个动态列表&#xff0c;数据很复杂时&#xff0c;JavaScript程序员喜欢把他们作为json串进行处理&#xff0c;后台收到后需要对json字符串进行解析&#xff0c;幸好有JSON-lib&#xff0c;这个Java类包用于把bean,map和…

为什么把端口号改为80之后,访问的时候就可以不写端口号

一个关于tomcat的问题为什么把端口号改为80之后&#xff0c;访问的时候就可以不写端口号因为80端口是许多web服务器的默认端口&#xff0c;比如iis和apache&#xff0c;所有为了方便,浏览器在不知道请求端口的情况下默认会访问服务器的80端口百度知道这样的话就可以恶作剧了打开…

linux——服务器与客户端实现聊天功能

先联想一下聊天的场景&#xff0c;假设甲和乙在聊天&#xff0c;他们每个人都能够发送给对方一句话甚至多句话&#xff0c;也能接收到对方发来的一句或多句话&#xff0c;也就是说&#xff0c;甲在发送一句话给乙的时候&#xff0c;同时也能接收到乙发来的信息&#xff0c;而且…

有关链表的小技巧,我都给你总结好了

链表链表是数据结构里一个很基础但是又很爱考的线性结构&#xff0c;链表的操作相对来说比较简单&#xff0c;但是非常适合考察面试者写代码的能力&#xff0c;以及对 corner case 的处理&#xff0c;还有指针的应用很容易引起 NPE (null pointer exception)。综合以上原因&…

long类型20位示例_Java Long类numberOfTrailingZeros()方法及示例

long类型20位示例长类numberOfTrailingZeros()方法 (Long class numberOfTrailingZeros() method) numberOfTrailingZeros() method is available in java.lang package. 在java.lang包中提供了numberOfTrailingZeros()方法 。 numberOfTrailingZeros() method is used to retu…

ActiveReports 9实战教程(1): 手把手搭建环境Visual Studio 2013 社区版

ActiveReports 9刚刚发布3天&#xff0c;微软就发布了 Visual Studio Community 2013 开发环境。Visual Studio Community 2013 提供完整功能的 IDE &#xff0c;可开发 Windows、Android 和 iOS 应用。支持&#xff1a;C, Python, HTML5, JavaScript, 和 C#,VB, F# 语言的开发…

第 1-1 课:Java 程序是如何执行的?

了解任何一门语言的精髓都是先俯览其全貌&#xff0c;从宏观的视角把握全局&#xff0c;然后再深入每个知识点逐个击破&#xff0c;这样就可以深入而快速的掌握一项技能。同样学习 Java 也是如此&#xff0c;本节就让我们先从整体来看一下 Java 中的精髓。 Java 介绍 Java 诞…

linux——两个客户端之间实现聊天(TCP、单线程)

两个客户端实现聊天功能&#xff0c;那么服务器作转发信息的作用&#xff0c;客户端A先将信息发送到服务器&#xff0c;在由服务器将信息发送到客户端B&#xff0c;客户端B也是一样。客户端与服务器都应该有两个执行流&#xff0c;服务器的一个执行流不断的接收客户端A的信息并…

Java ClassLoader getSystemClassLoader()方法与示例

ClassLoader类getSystemClassLoader()方法 (ClassLoader Class getSystemClassLoader() method) getSystemClassLoader() method is available in java.lang package. getSystemClassLoader()方法在java.lang包中可用。 getSystemClassLoader() method is used to find the Sys…

zabbix邮件通知,短信通知配置详解

一、使用邮件发送报警1、前提条件是zabbix我们已经安装完成2、在官网我们下载msmtp的文件http://sourceforge.net/projects/msmtp/files/msmtp/1.4.32/msmtp-1.4.32.tar.bz2/download tar xf msmtp-1.4.32.tar.bz2 cd msmtp-1.4.32 ./configure--prefix/usr/local/msmtp make m…

关于怎么获取jsp的web站点的目录问题

发布了自己的web站点之后&#xff0c;想要访问站点文件夹下的某个文本文件&#xff0c;但是却不知道怎么找到文件根目录&#xff0c;一直尝试总是找不到文件……好不容易在网上翻了堆代码找到两句我现在急用的……so//根目录路径的获取System.out.println(request.getSession()…

开篇词:如何轻松获得 Offer

你好,我是王磊,某上市公司技术研发经理,前奇虎 360 员工,有着 10 余年的编程工作经验,目前主要负责新员工技术面试和构建企业技术架构的相关事宜。随着面试过的人数增加,我发现面试者们暴露出了技术方面的很多问题,为了让更多面试者少走一些弯路,也为了让企业能招到合适…

Java类类getGenericSuperclass()方法及示例

类类getGenericSuperclass()方法 (Class class getGenericSuperclass() method) getGenericSuperclass() method is available in java.lang package. getGenericSuperclass()方法在java.lang包中可用。 getGenericSuperclass() method is used to return the Type denoting th…