c语言多进程并发服务器

news/2024/6/17 10:58:10 标签: c, socket, 僵尸进程, 多进程服务器
cle class="baidu_pl">
cle_content" class="article_content clearfix">
content_views" class="markdown_views prism-github-gist"> cap="round" d="M5,0 0,2.5 5,5z" id="raphael-marker-block" style="-webkit-tap-highlight-color: rgba(0, 0, 0, 0);">

class="toc">

文章目录

  • c语言多进程并发服务器
    • 服务端
    • 客户端

c_1">c语言多进程并发服务器

服务端

<code class="prism language-java">#includeclass="token generics function">class="token punctuation"><stdioclass="token punctuation">.hclass="token punctuation">>
#includeclass="token generics function">class="token punctuation"><unistdclass="token punctuation">.hclass="token punctuation">>
#includeclass="token operator"><sysclass="token operator">/typesclass="token punctuation">.hclass="token operator">>
#includeclass="token operator"><sysclass="token operator">/socketclass="token punctuation">.hclass="token operator">>
#includeclass="token operator"><arpaclass="token operator">/inetclass="token punctuation">.hclass="token operator">>
#includeclass="token generics function">class="token punctuation"><stringclass="token punctuation">.hclass="token punctuation">>
#includeclass="token generics function">class="token punctuation"><stringsclass="token punctuation">.hclass="token punctuation">>
#includeclass="token generics function">class="token punctuation"><ctypeclass="token punctuation">.hclass="token punctuation">>
#includeclass="token generics function">class="token punctuation"><stdlibclass="token punctuation">.hclass="token punctuation">>
#includeclass="token generics function">class="token punctuation"><signalclass="token punctuation">.hclass="token punctuation">>
#includeclass="token generics function">class="token punctuation"><waitclass="token punctuation">.hclass="token punctuation">>
class="token keyword">void class="token function">do_sigclass="token punctuation">(class="token keyword">int numclass="token punctuation">)class="token punctuation">{
    class="token keyword">whileclass="token punctuation">(class="token function">waitpidclass="token punctuation">(class="token number">0class="token punctuation">,NULLclass="token punctuation">,WNOHANGclass="token punctuation">)class="token operator">>class="token number">0class="token punctuation">)class="token punctuation">;
class="token punctuation">}
class="token keyword">int class="token function">mainclass="token punctuation">(class="token keyword">voidclass="token punctuation">)class="token punctuation">{
    	class="token comment">//lfd:socket返回的文件描述符࿰c;用lfd监听并接受客户端连接
   		class="token comment">//cfd:客户端链接上来返回的cfd࿰c;用cfd和客户端通信
        class="token keyword">int lfdclass="token punctuation">,cfdclass="token punctuation">,lenclass="token punctuation">,iclass="token punctuation">;
        class="token keyword">char bufclass="token punctuation">[class="token number">1024class="token punctuation">]class="token punctuation">;class="token comment">//缓冲区
        class="token comment">//serv_addr服务器地址
        class="token comment">//client_addr客户端地址
        struct sockaddr_in serv_addrclass="token punctuation">,client_addrclass="token punctuation">;
        socklen_t client_lenclass="token punctuation">;
        class="token comment">//进程id
        pid_t pidclass="token punctuation">;
        class="token comment">//杀死僵尸进程 
    	struct sigaction actclass="token punctuation">;
    	actclass="token punctuation">.sa_handler class="token operator">= do_sigclass="token punctuation">;
   	 	actclass="token punctuation">.sa_flags class="token operator">= class="token number">0class="token punctuation">;
    	class="token function">sigemptysetclass="token punctuation">(class="token operator">&actclass="token punctuation">.sa_maskclass="token punctuation">)class="token punctuation">;
    	class="token function">sigactionclass="token punctuation">(SIGCHLDclass="token punctuation">,class="token operator">&actclass="token punctuation">,NULLclass="token punctuation">)class="token punctuation">;

    	class="token comment">//socket创建服务器返回lfd文件描述符
        lfd class="token operator">= class="token function">socketclass="token punctuation">(AF_INETclass="token punctuation">,SOCK_STREAMclass="token punctuation">,class="token number">0class="token punctuation">)class="token punctuation">;
        class="token function">bzeroclass="token punctuation">(class="token operator">&serv_addrclass="token punctuation">,class="token function">sizeofclass="token punctuation">(serv_addrclass="token punctuation">)class="token punctuation">)class="token punctuation">;
        class="token comment">//ipv4
        serv_addrclass="token punctuation">.sin_family class="token operator">= AF_INETclass="token punctuation">;
        class="token comment">//端口 本地字节序转网络字节序 host to net short 大小端存储问题
        serv_addrclass="token punctuation">.sin_port class="token operator">= class="token function">htonsclass="token punctuation">(class="token number">9999class="token punctuation">)class="token punctuation">;
        class="token comment">//ip host to net long
        serv_addrclass="token punctuation">.sin_addrclass="token punctuation">.s_addr class="token operator">= class="token function">htonlclass="token punctuation">(INADDR_ANYclass="token punctuation">)class="token punctuation">;
        class="token comment">//bind
        class="token function">bindclass="token punctuation">(lfdclass="token punctuation">,class="token punctuation">(struct sockaddrclass="token operator">*class="token punctuation">)class="token operator">&serv_addrclass="token punctuation">,class="token function">sizeofclass="token punctuation">(serv_addrclass="token punctuation">)class="token punctuation">)class="token punctuation">;
        class="token comment">//监听是否有客户连接
        class="token function">listenclass="token punctuation">(lfdclass="token punctuation">,class="token number">128class="token punctuation">)class="token punctuation">;
        class="token function">printfclass="token punctuation">(class="token string">"wait for connect...\n"class="token punctuation">)class="token punctuation">;
        class="token keyword">whileclass="token punctuation">(class="token number">1class="token punctuation">)class="token punctuation">{
           client_len class="token operator">= class="token function">sizeofclass="token punctuation">(client_addrclass="token punctuation">)class="token punctuation">;class="token comment">//客户端地址长度
           class="token comment">//连接成功返回cfd࿰c;用cfd和客户通信
           cfd class="token operator">= class="token function">acceptclass="token punctuation">(lfdclass="token punctuation">,class="token punctuation">(struct sockaddrclass="token operator">*class="token punctuation">)class="token operator">&client_addrclass="token punctuation">,class="token operator">&client_lenclass="token punctuation">)class="token punctuation">;
           class="token function">printfclass="token punctuation">(class="token string">"connect success...\n"class="token punctuation">)class="token punctuation">;
           class="token comment">//创建进程
           pid class="token operator">= class="token function">forkclass="token punctuation">(class="token punctuation">)class="token punctuation">;
           class="token keyword">ifclass="token punctuation">(pidclass="token operator">==class="token number">0class="token punctuation">)class="token punctuation">{class="token comment">//child
                class="token function">closeclass="token punctuation">(lfdclass="token punctuation">)class="token punctuation">;class="token comment">//子进程用不到lfd࿰c;因为lfd是父进程用来接收客户端连接的
                class="token keyword">whileclass="token punctuation">(class="token number">1class="token punctuation">)class="token punctuation">{

			len class="token operator">= class="token function">readclass="token punctuation">(cfdclass="token punctuation">,bufclass="token punctuation">,class="token function">sizeofclass="token punctuation">(bufclass="token punctuation">)class="token punctuation">)class="token punctuation">;
			class="token function">printfclass="token punctuation">(class="token string">"receive: %s\n"class="token punctuation">,bufclass="token punctuation">)class="token punctuation">;
			class="token keyword">ifclass="token punctuation">(lenclass="token operator"><=class="token number">0class="token punctuation">)class="token keyword">breakclass="token punctuation">;
			class="token keyword">forclass="token punctuation">(iclass="token operator">=class="token number">0class="token punctuation">;iclass="token operator"><lenclass="token punctuation">;class="token operator">++iclass="token punctuation">)
		    		 bufclass="token punctuation">[iclass="token punctuation">] class="token operator">= class="token function">toupperclass="token punctuation">(bufclass="token punctuation">[iclass="token punctuation">]class="token punctuation">)class="token punctuation">;
			class="token function">writeclass="token punctuation">(cfdclass="token punctuation">,bufclass="token punctuation">,lenclass="token punctuation">)class="token punctuation">;
		class="token punctuation">}
		class="token function">closeclass="token punctuation">(cfdclass="token punctuation">)class="token punctuation">;class="token comment">//客户端断开连接 
		class="token keyword">return class="token number">0class="token punctuation">;
      class="token punctuation">}class="token keyword">else class="token keyword">ifclass="token punctuation">(pidclass="token operator">>class="token number">0class="token punctuation">) class="token punctuation">{class="token comment">//parent
	   	class="token function">closeclass="token punctuation">(cfdclass="token punctuation">)class="token punctuation">;class="token comment">//父亲进程用不到cfd࿰c;因为cfd是子进程用来和客户端通信的 
      class="token punctuation">}class="token keyword">elseclass="token punctuation">{
		class="token function">perrorclass="token punctuation">(class="token string">"fork fail..."class="token punctuation">)class="token punctuation">;
		class="token function">exitclass="token punctuation">(class="token number">1class="token punctuation">)class="token punctuation">;
	    class="token punctuation">}
	class="token punctuation">}

class="token punctuation">}
code>

客户端

<code class="prism language-java">#includeclass="token generics function">class="token punctuation"><stdioclass="token punctuation">.hclass="token punctuation">>
#includeclass="token generics function">class="token punctuation"><stdlibclass="token punctuation">.hclass="token punctuation">>
#includeclass="token generics function">class="token punctuation"><errnoclass="token punctuation">.hclass="token punctuation">>
#includeclass="token generics function">class="token punctuation"><stringclass="token punctuation">.hclass="token punctuation">>
#includeclass="token operator"><sysclass="token operator">/typesclass="token punctuation">.hclass="token operator">>
#includeclass="token operator"><netinetclass="token operator">/inclass="token punctuation">.hclass="token operator">>
#includeclass="token operator"><sysclass="token operator">/socketclass="token punctuation">.hclass="token operator">>
#includeclass="token operator"><sysclass="token operator">/waitclass="token punctuation">.hclass="token operator">> 
#define DEST_PORT class="token number">9999class="token comment">//目标地址端口号 
#define DEST_IP class="token string">"127.32.255.2"class="token comment">/*目标地址IP࿰c;这里设为本机࿰c;不一定非得是127.0.0.1,只要127开头并且不是127.0.0.0和127.255.255.255即可*/ 
#define MAX_DATA class="token number">100class="token comment">//接收到的数据最大程度 
 
class="token keyword">int class="token function">mainclass="token punctuation">(class="token punctuation">)class="token punctuation">{
	class="token keyword">int sockfdclass="token punctuation">;
	struct sockaddr_in dest_addrclass="token punctuation">;
	class="token keyword">char bufclass="token punctuation">[MAX_DATAclass="token punctuation">]class="token punctuation">;
 
	sockfdclass="token operator">=class="token function">socketclass="token punctuation">(AF_INETclass="token punctuation">,SOCK_STREAMclass="token punctuation">,class="token number">0class="token punctuation">)class="token punctuation">;
	
	dest_addrclass="token punctuation">.sin_familyclass="token operator">=AF_INETclass="token punctuation">;
 	dest_addrclass="token punctuation">.sin_portclass="token operator">=class="token function">htonsclass="token punctuation">(DEST_PORTclass="token punctuation">)class="token punctuation">;
	dest_addrclass="token punctuation">.sin_addrclass="token punctuation">.s_addrclass="token operator">=class="token function">inet_addrclass="token punctuation">(DEST_IPclass="token punctuation">)class="token punctuation">;
	class="token function">bzeroclass="token punctuation">(class="token operator">&class="token punctuation">(dest_addrclass="token punctuation">.sin_zeroclass="token punctuation">)class="token punctuation">,class="token number">8class="token punctuation">)class="token punctuation">;
	class="token function">connectclass="token punctuation">(sockfdclass="token punctuation">,class="token punctuation">(struct sockaddrclass="token operator">*class="token punctuation">)class="token operator">&dest_addrclass="token punctuation">,class="token function">sizeofclass="token punctuation">(struct sockaddrclass="token punctuation">)class="token punctuation">)class="token punctuation">;

	class="token function">printfclass="token punctuation">(class="token string">"connect success"class="token punctuation">)class="token punctuation">;
	class="token keyword">whileclass="token punctuation">(class="token number">1class="token punctuation">)class="token punctuation">{
		class="token keyword">char send_bufclass="token punctuation">[class="token number">512class="token punctuation">] class="token operator">= class="token string">""class="token punctuation">;
		class="token function">scanfclass="token punctuation">(class="token string">"%s"class="token punctuation">,class="token operator">&send_bufclass="token punctuation">)class="token punctuation">;
		class="token function">writeclass="token punctuation">(sockfdclass="token punctuation">,send_bufclass="token punctuation">,class="token function">sizeofclass="token punctuation">(send_bufclass="token punctuation">)class="token punctuation">)class="token punctuation">;
		
		class="token function">readclass="token punctuation">(sockfdclass="token punctuation">,send_bufclass="token punctuation">,class="token function">sizeofclass="token punctuation">(send_bufclass="token punctuation">)class="token punctuation">)class="token punctuation">;
    	class="token function">printfclass="token punctuation">(class="token string">"client receive:%s\n"class="token punctuation">,send_bufclass="token punctuation">)class="token punctuation">;
	class="token punctuation">}

	class="token keyword">return class="token number">0class="token punctuation">;
class="token punctuation">} 

code>

centos执行
gcc -o server.out server.c
gcc -o client.out client.c
得到执行文件server.out,client.out
用xshell 对一个虚拟机开两个item窗口࿰c;一个执行./server.out ࿰c;另一个执行./client.out
可以用ps -aux 查看进程状态࿰c;看看有没有僵尸进程c;本例中已经处理过僵尸进程

cle>

http://www.niftyadmin.cn/n/1037703.html

相关文章

jvm--描述一下 JVM 加载 Class 文件的原理机制?

Java 语言是一种具有动态性的解释型语言&#xff0c;类&#xff08;Class&#xff09;只有被加载到 JVM 后才能运行。当运行指定程序时&#xff0c;JVM 会将编译生成的 .class 文件按照需求和一定的规则加载到内存中&#xff0c;并组织成为一个完整的 Java 应用程序。这个加载过…

Global区域模块化开发,MVC改变默认访问控制器视图

在项目过大时可能会出现Controllers下一堆控制器的奇葩情况 但又能怎么办呢&#xff1f;确实需要啊 我们就可以新建一个区域 进行模块开发 例如我们新分一个用户注册模块 右击解决方案下的项目 选择 添加 > 新搭建基架的项目 然后选项中选择MVC中的MVC 5 区域 然后随便起…

c语言多线程并发服务器

文章目录c语言多线程并发服务器服务端客户端c语言多线程并发服务器 服务端 #include<stdio.h> #include<unistd.h> #include<sys/types.h> #include<sys/socket.h> #include<arpa/inet.h> #include<string.h> #include<strings.h>…

IO多路复用之select模型

文章目录IO多路复用之select模型前言select模型select例子select服务端客户端select深度剖析select函数fd_set位图IO多路复用之select模型 前言 最近一段时间在研究redis&#xff0c;才发现自己基础不牢靠&#xff0c;所以最近一直在学习网络原理及c语言socket方面的知识&…

JVM--Java 内存分配?

• 寄存器&#xff1a;我们无法控制。 • 静态域&#xff1a;static 定义的静态成员。 • 常量池&#xff1a;编译时被确定并保存在 .class 文件中的&#xff08;final&#xff09;常量值和一些文本修饰的符号引用&#xff08;类和接口的全限定名&#xff0c;字段的名称和描述符…

C#项目启动会闪退问题解决

很多初学者在建立第一个 控制台应用时都会遇到 点击上方启动按钮 然后程序闪退的问题 其实也很简单 在后面加上 Console.ReadLine();即可 参考代码如下 using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tas…

IO多路复用之poll模型

文章目录IO多路复用之poll模型前言poll实例IO多路复用之poll模型 前言 由于本文需要一定基础&#xff0c;当然&#xff0c;吃c语言饭的人除外&#xff0c;如果你是java出身的&#xff0c;请先看我上一篇博客select poll io从最开始的bio发展到nio&#xff0c;aio&#xff0…

jvm --- GC 是什么? 为什么要有 GC?

GC 是垃圾收集的意思&#xff08;GabageCollection&#xff09;&#xff0c;内存处理是编程人员容易出现问题的地方&#xff0c; 忘记或者错误的内存回收会导致程序或系统的不稳定甚至崩溃&#xff0c; Java 提供的 GC 功能可以自动监测对象是否超过作用域从而达到自动回收内存…