Linux:多进程和多线程回环socket服务器和客户端

news2024/11/26 0:52:23

多进程socket服务器代码:

#include <stdio.h>
#include <unistd.h>
#include <sys/types.h>
#include <sys/socket.h>
#include <arpa/inet.h>
#include <string.h>
#include <ctype.h>
#include <sys/wait.h>
#include <signal.h>
#include <stdlib.h>

void catch_child(int signo) {
pid_t wpid;
int status;
while((wpid = waitpid(-1, &status,WNOHANG)) > 0) {
// if(WIFEXITED(status))
printf(“catch child id %d, catch signal=%d\n”, wpid, signo);
}

}

int main()
{
pid_t pid;
/* sigset_t set;
sigemptyset(&set);
sigaddset(&set, SIGCHLD);
sigprocmask(SIG_BLOCK, &set, NULL);

struct sigaction act;
act.sa_handler = catch_child;
sigemptyset(&act.sa_mask);
act.sa_flags = 0;
sigaction(SIGCHLD, &act, NULL);
sigprocmask(SIG_UNBLOCK, &set, getpid());

*/
int lfd = socket(AF_INET,SOCK_STREAM,0);
struct sockaddr_in addr_ser;
addr_ser.sin_family = AF_INET;
addr_ser.sin_port = htons(8888);
addr_ser.sin_addr.s_addr = htonl(INADDR_ANY);
int ret = bind(lfd,(struct sockaddr *)&addr_ser,sizeof(addr_ser));
listen(lfd,256);
struct sockaddr_in addr_client;
socklen_t addrlen = sizeof(addr_client);
while(1) {
int cfd = accept(lfd,(struct sockaddr )&addr_client,&addrlen);
/
if (cfd = -1) {
perror(“accept error”);
exit(1);
} else */
if(cfd > 0) {
pid = fork();
}

	if(pid > 0) { //parent
		struct sigaction act;
		act.sa_handler = catch_child;
		act.sa_flags = 0;
		sigemptyset(&act.sa_mask);
		sigaction(SIGCHLD,&act,NULL);
		close(cfd);
		char str_ip[INET_ADDRSTRLEN];
		char *cli_ip = inet_ntop(AF_INET,&(addr_client.sin_addr.s_addr),str_ip,sizeof(str_ip));
		int cli_pot = ntohs(addr_client.sin_port);
		printf("get client ip:%s port:%d\n",cli_ip,cli_pot);
		char *ptr = inet_ntop(AF_INET,&(addr_ser.sin_addr.s_addr),str_ip,sizeof(str_ip));
		printf("server ip:%s\n",str_ip);
	} else if(pid == 0) {
		close(lfd);
		char buf[BUFSIZ];
		while(1) {
			memset(buf,0,sizeof(buf));
			int ret = read(cfd, buf, sizeof(buf));
			if(ret == 0) return 0;
			printf("receive from client:%s\n",buf);
			int i = 0;
			for(i=0; i<ret; i++) {
				buf[i]=toupper(buf[i]);
			}
			write(cfd,buf,ret);
			printf("send to client: %s\n",buf);
	
		}	
	}

}	
close(lfd);
return 0;

}

多线程回环socket服务器代码:

#include <stdio.h>
#include <unistd.h>
#include <sys/types.h>
#include <sys/socket.h>
#include <arpa/inet.h>
#include <string.h>
#include <ctype.h>
#include <sys/wait.h>
#include <signal.h>
#include <stdlib.h>
#include <pthread.h>

void * client_handle(void * arg) {
char buf[BUFSIZ];
int cfd = *(int *)arg;
while(1) {
memset(buf,0,sizeof(buf));
int ret = read(cfd, buf, sizeof(buf));
if(ret == 0)
{
close(cfd);
return 0;
}
printf(“cfd = %d, receive from client:%s\n”,cfd,buf);
int i = 0;
for(i=0; i<ret; i++) {
buf[i]=toupper(buf[i]);
}
sleep(1);
write(cfd,buf,ret);
printf(“send to client: %s\n”,buf);

		}	

}

int main()
{
pthread_t thread;
int lfd = socket(AF_INET,SOCK_STREAM,0);
struct sockaddr_in addr_ser;
addr_ser.sin_family = AF_INET;
addr_ser.sin_port = htons(8888);
addr_ser.sin_addr.s_addr = htonl(INADDR_ANY);
int ret = bind(lfd,(struct sockaddr *)&addr_ser,sizeof(addr_ser));
listen(lfd,256);
struct sockaddr_in addr_client;
socklen_t addrlen = sizeof(addr_client);
while(1) {
int cfd = accept(lfd,(struct sockaddr *)&addr_client,&addrlen);
if(cfd > 0) {
printf(“cfd = %d \n”,cfd);
pthread_create(&thread,NULL,client_handle,(void *)&cfd);
pthread_detach(thread);
}

		char str_ip[INET_ADDRSTRLEN];
		char *cli_ip = inet_ntop(AF_INET,&(addr_client.sin_addr.s_addr),str_ip,sizeof(str_ip));
		int cli_pot = ntohs(addr_client.sin_port);
		printf("get client ip:%s port:%d\n",cli_ip,cli_pot);
		char *ptr = inet_ntop(AF_INET,&(addr_ser.sin_addr.s_addr),str_ip,sizeof(str_ip));
		printf("server ip:%s\n",str_ip);
	}
close(lfd);
return 0;

}

客户端代码:

#include <stdio.h>
#include <unistd.h>
#include <sys/types.h>
#include <sys/socket.h>
#include <arpa/inet.h>
#include <string.h>

int main()
{
char * data = “hello”;
int cfd = socket(AF_INET,SOCK_STREAM,0);
struct sockaddr_in addr_ser;
addr_ser.sin_family = AF_INET;
addr_ser.sin_port = htons(8888);

//addr_ser.sin_addr.s_addr = htonl(INADDR_ANY);

const char * src = "127.0.0.1";
inet_pton(AF_INET,src,(void *)&(addr_ser.sin_addr.s_addr));

connect(cfd,(struct sockaddr *)&addr_ser,sizeof(addr_ser));


socklen_t addrlen;
char str[INET_ADDRSTRLEN];
char *ptr = inet_ntop(AF_INET,&(addr_ser.sin_addr.s_addr),str,sizeof(str));

// printf(“connect to server ip:%s\n”,ptr);
char rebuf[256];
while(1) {
printf(“send: %s\n”,data);
write(cfd,data,sizeof(data));
//printf(“send: %s\n”,buf);
// sleep(1);
int ret = read(cfd,rebuf,sizeof(rebuf));
if(ret > 0) {
printf(“recev: %s\n”,rebuf);
}
sleep(1);
}
close(cfd);
return 0;
}

结果:

多进程服务器端:
michael@SD-20220518ZLPG:~/test_server$ ./server_fork.out
get client ip:127.0.0.1 port:63918
receive from client:hello
server ip:0.0.0.0
send to client: HELLO
receive from client:hello
send to client: HELLO
receive from client:hello
send to client: HELLO
receive from client:hello
send to client: HELLO
receive from client:hello
send to client: HELLO
receive from client:hello
send to client: HELLO
receive from client:hello
send to client: HELLO
receive from client:hello
send to client: HELLO
get client ip:127.0.0.1 port:63919
receive from client:hello
server ip:0.0.0.0
send to client: HELLO
receive from client:hello
send to client: HELLO
receive from client:hello
send to client: HELLO
receive from client:hello
send to client: HELLO
catch child id 2178, catch signal=17
get client ip:127.0.0.1 port:63919
server ip:0.0.0.0
receive from client:hello
send to client: HELLO
receive from client:hello
send to client: HELLO
receive from client:hello
send to client: HELLO

查看客户端和进程:

在这里插入图片描述
查看多线程服务器和客户端:
在这里插入图片描述

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

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

相关文章

JWT 使用

前端访问后台a系统和b系统访问 Json web token (JWT), 是为了在网络应用环境间传递声明而执行的一种基于JSON的开放标准&#xff08;(RFC 7519).该token被设计为紧凑且安全的&#xff0c;特别适用于分布式站点的单点登录&#xff08;SSO&#xff09;场景。 JWT的本质就是一个…

记录安装DragGAN遇到的问题

首先第一个是安装的问题 安装的envirenment.yml有很多包过时了下载不了&#xff0c;可以参考以下文章写一个requirement.txt来下载依赖环境 --extra-index-url https://download.pytorch.org/whl/cu118 numpy1.23.5 click scipy pillow9.5.0 requests tqdm4.65.0 ninja matpl…

哪些语句会被waf屏蔽?

什么是waf&#xff1a;Web应用防火墙&#xff0c;Web Application Firewall的简称。 waf的功能&#xff1a;WAF可以发现和拦截各类Web层面的攻击&#xff0c;记录攻击日志&#xff0c;实时预警提醒&#xff0c;在Web应 用本身存在缺陷的情况下保障其安全。 封IP &#xff1a;…

Qt应用开发——QLineEdit

目录 一、概述 二、属性和方法 三、信号 一、概述 QLineEdit允许用户输入和编辑单行纯文本&#xff0c;并可以使用快捷编辑功能&#xff0c;包括复制、粘贴、剪切和拖放。是项目开发中最常用的输入控件。 默认键绑定描述如下。 Left Arrow //将光标向左移…

Fourier变换极其应用(Brad G. Osgood)——第1章——Fourier级数

目录 第1章 Fourier级数 1.1 选择&#xff1a;“欢迎入局”(Choices: Welcome Aboard) 1.2 周期性现象(Periodic phenomena) 1.2.1 时间和空间(time and space) 1.2.1.1 时间和空间周期性在波动中最自然地结合在一起 1.2.1.2 更多关于空间的周期性例子 1.2.2 定义&…

11 简单的Thymeleaf语法

11.1 spring-boot环境准备 重要依赖&#xff1a; <!--thymeleaf--> <dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-thymeleaf</artifactId> </dependency> 11.2 转发消息不转义 就是如…

picgo Request failed with status code 404

今天写picgo的时候&#xff0c;出现了一个错误&#xff0c;如何解决&#xff1a; 这里是repo的配置出现了问题&#xff0c;不过我的是因为粗心&#xff0c;把master写成了mater&#xff0c;emmmm 这里的repo要跟仓库的地址相同就是这一块&#xff1a;把这一块填到repo就行 然…

Linux查看二进制文件

Linux查看二进制文件 hexdump、hd、od、xxd hexdump、hd 可以使用16进制、10进制、8进制、ascii码的形式查看文件。 执行 ls -al which hd就会看到hd其实只是hexdump的一个软链接。 使用man hexdump&#xff0c;可以查看hexdump的各种参数。 -b, --one-byte-octal 单字节…

使用SQL JOIN语句把来自两个或多个表的行结合起来

先创建一个表&#xff1a; 创建一个名为 websites 的表 CREATE TABLE websites ( id int, name varchar(255), url varchar(255), alexa varchar(255), country varchar(255) ); 然后给它插入一些数据&#xff08;插入了四行新数据&#xff09;&#xff1a; insert into we…

详解go的hex.Encode原理

简言 今天看nsq的messageID生成的时候&#xff0c;发现它使用了hex.Encode函数来产生编码&#xff0c;那就顺道研究一下这个编码方式。 原理 hex是16进制的意思&#xff0c;encode是进行编码的意思&#xff0c;内部实现也很简单&#xff0c;就是 每4位计算出十六进制的值&a…

Idea项目初始化配置

Idea项目初始化配置 &#x1f4d4; 千寻简笔记介绍 千寻简笔记已开源&#xff0c;Gitee与GitHub搜索chihiro-notes&#xff0c;包含笔记源文件.md&#xff0c;以及PDF版本方便阅读&#xff0c;且是用了精美主题&#xff0c;阅读体验更佳&#xff0c;如果文章对你有帮助请帮我…

Node.js: express + MySQL实现修改密码

实现修改密码&#xff0c;本篇文章实现修改密码只考虑以下几个方面&#xff1a; &#xff08;1&#xff09;&#xff0c;获取旧密码 &#xff08;2&#xff09;&#xff0c;获取新密码 &#xff08;3&#xff09;&#xff0c;将获取到的旧密码与数据库中的密码进行比对&#xf…

IC 后端 corner 介绍

在数字IC后端&#xff0c;有对晶体管的偏差建模的PVT corner&#xff0c;以及对互连线偏差建模的RC corner。 芯片的延迟一般受到三个因素的影响&#xff1a;工艺&#xff08;Process&#xff09;、电压&#xff08;Voltage&#xff09;、温度&#xff08;Temperature&#xff…

rabbitmq是什么?rabbitmq安装、原理、部署

rabbitmq是什么&#xff1f; MQ的全称是Messagee Queue&#xff0c;因为消息的队列是队列&#xff0c;所以遵循FIFO 先进先出的原则是上下游传递信息的跨过程通信机制。 RabbitMQ是一套开源&#xff08;MPL&#xff09;新闻队列服务软件由 LShift 提供的一个 Advanced Messag…

linux学成之路(基础篇)(二十一)nfs服务器

前言 NFS是Network File System的缩写&#xff0c;它是一种在计算机网络中共享文件和文件系统的协议。NFS允许不同的计算机系统之间通过网络访问、读取和写入远程文件&#xff0c;就像访问本地文件一样。它是一种基于客户端-服务器体系结构的协议&#xff0c;其中一个计算机充当…

Python(三十五)pass语句

❤️ 专栏简介&#xff1a;本专栏记录了我个人从零开始学习Python编程的过程。在这个专栏中&#xff0c;我将分享我在学习Python的过程中的学习笔记、学习路线以及各个知识点。 ☀️ 专栏适用人群 &#xff1a;本专栏适用于希望学习Python编程的初学者和有一定编程基础的人。无…

excel中的vlookup如何实现根据多个条件查找?

目录 简述问题公式思路通用公式三条件查找公式实例 简述 Excel 中根据一个条件查找非常方便&#xff0c;Excel 提供了内置函数 VLOOKUP。但是实际中往往有多种情形&#xff0c;需要根据多个条件进行查找操作&#xff0c;目前没有现成的内置函数。 本篇介绍 VLOOKPCHOOSE 组合…

SpringBoot读取配置的几种方式

SpringBoot读取配置的方式有多种&#xff0c;这里介绍6种 1.第一种Value 注意&#xff1a;static和final修饰的变量不生效 2.通过ConfigurationProperties&#xff08;prefix“”&#xff09; 适用于对对象多个变量统一绑定&#xff0c;比Value高效 3.通过Environment Sprin…

信创环境下,使用国产服务器如何进行文件高速可靠传输?

信创&#xff0c;即信息技术应用创新&#xff0c;2018年以来&#xff0c;受“华为、中兴事件”影响&#xff0c;国家将信创产业纳入国家战略&#xff0c;并提出了“28n”发展体系。从产业链角度&#xff0c;信创产业生态体系较为庞大&#xff0c;主要包括基础硬件、基础软件、应…

堆和栈的区别以及栈的顺序存储和链式存储—Python数据结构(三)

栈 一、栈 1. 定义 栈是限制在一端进行插入操作和删除操作的线性表(俗称堆栈)&#xff0c; 允许进行操作的一端称为”栈顶“&#xff0c;另一固定端称为”栈底“&#xff0c;当栈中没有元素时称为”空栈“。 2. 特点 栈只能在一端进行操作。 栈模型具有先进后出&#xff…