网络编程day3作业

多进程实现TCP并发服务器

#include<myhead.h>

#define PORT 8888
#define IP "192.168.125.130"

void hadder(int signo)
{
	if(signo == SIGCHLD)
	{
		while(waitpid(-1,NULL,WNOHANG) > 0);
	}
}

int information_exchange(int newfd,struct sockaddr_in cin)
{
	char buf[128]="";
	while(1)
	{
		bzero(buf,sizeof(buf));
		int res = recv(newfd,buf,sizeof(buf),0);
		printf("%s\n",buf);
		if(res == 0)
		{
			printf("断开连接\n");
			break;
		}
		//printf("%s\n",buf);
		strcpy(buf,"*-*");
		send(newfd,buf,sizeof(buf),0);
	}
	close(newfd);
}


int main(int argc, const char *argv[])
{
	//给信号重新链接
	if(signal(SIGCHLD,hadder) == SIG_ERR)
	{
		perror("signal error");
		return -1;
	}
	//创建套接字文件
	int sfd = -1;
	if((sfd = socket(AF_INET,SOCK_STREAM,0)) == -1)
	{
		perror("socket error");
		return -1;
	}
	//重复链接设置端口快速重用
	int reuse = -1;
	if(setsockopt(sfd,SOL_SOCKET,SO_REUSEADDR,&reuse,sizeof(reuse)) == -1)
	{
		perror("setsockopt error");
		return -1;
	}
	
	
	//传输IP和端口号
	struct sockaddr_in sin;
	sin.sin_family = AF_INET;
	sin.sin_port = htons(PORT);
	sin.sin_addr.s_addr = inet_addr(IP);
	if(bind(sfd,(struct sockaddr*)&sin,sizeof(sin)) == -1)
	{
		perror("bind error");
		return -1;
	}
	printf("bind success\n");

	//设置监听模式
	if(listen(sfd,128) == -1)
	{
		perror("listen error");
		return -1;
	}
	printf("listen success\n");
	struct sockaddr_in cin;
	socklen_t addrlen = sizeof(cin);
	int newfd = -1;
	pid_t pid = -1;

	while(1)
	{
		//接受客户端链接
		if((newfd = accept(sfd,(struct sockaddr*)&cin,&addrlen)) == -1)
		{
			perror("accept error");
			return -1;
		}
		pid = fork();
		if(pid > 0)
		{
			close(newfd);
			
		}else if(pid == 0)
		{
			close(sfd);
			information_exchange(newfd,cin);
			exit(EXIT_SUCCESS);
		}
		else
		{
			perror("fork error");
			return -1;
		}

	}
	close(sfd);

	return 0;
}

 多线程实现TCP并发服务器

#include<myhead.h>

#define PORT 8888
#define IP "192.168.125.130"

struct pthread_d 
{
	int newfd;
	struct sockaddr_in cin;
};

void* information_exchange(void* arg)
{
	int newfd = ((struct pthread_d*)arg)->newfd;
	struct sockaddr_in cin = ((struct pthread_d*)arg)->cin;
	char buf[128]="";
	while(1)
	{
		bzero(buf,sizeof(buf));
		int res = recv(newfd,buf,sizeof(buf),0);
		printf("%s\n",buf);
		if(res == 0)
		{
			printf("断开连接\n");
			break;
		}
		//printf("%s\n",buf);
		strcpy(buf,"*-*");
		send(newfd,buf,sizeof(buf),0);
	}
	close(newfd);
	pthread_exit(NULL);
}


int main(int argc, const char *argv[])
{
	//创建套接字文件
	int sfd = -1;
	if((sfd = socket(AF_INET,SOCK_STREAM,0)) == -1)
	{
		perror("socket error");
		return -1;
	}
	//重复链接设置端口快速重用
	int reuse = -1;
	if(setsockopt(sfd,SOL_SOCKET,SO_REUSEADDR,&reuse,sizeof(reuse)) == -1)
	{
		perror("setsockopt error");
		return -1;
	}
	
	
	//传输IP和端口号
	struct sockaddr_in sin;
	sin.sin_family = AF_INET;
	sin.sin_port = htons(PORT);
	sin.sin_addr.s_addr = inet_addr(IP);
	if(bind(sfd,(struct sockaddr*)&sin,sizeof(sin)) == -1)
	{
		perror("bind error");
		return -1;
	}
	printf("bind success\n");

	//设置监听模式
	if(listen(sfd,128) == -1)
	{
		perror("listen error");
		return -1;
	}
	printf("listen success\n");
	struct sockaddr_in cin;
	socklen_t addrlen = sizeof(cin);
	int newfd = -1;
	pthread_t tid = -1;

	while(1)
	{
		//接受客户端链接
		if((newfd = accept(sfd,(struct sockaddr*)&cin,&addrlen)) == -1)
		{
			perror("accept error");
			return -1;
		}
		struct pthread_d fifo={newfd,cin};
		if(pthread_create(&tid,NULL,information_exchange,&fifo) == -1)
		{
			perror("pthread_create error");
			return -1;
		}
		pthread_detach(tid);
		
	}
	close(sfd);

	return 0;
}

TCP机械臂测试

#include<myhead.h>

#define PORT 9998
#define SPORT 8888
#define IP "192.168.125.249"

int main(int argc, const char *argv[])
{
	//创建套接字文件
	int sfd = -1;
	if((sfd = socket(AF_INET,SOCK_STREAM,0)) == -1)
	{
		perror("socket error");
		return -1;
	}
	//重复链接设置端口快速重用
	int reuse = 1;
	if(setsockopt(sfd,SOL_SOCKET,SO_REUSEADDR,&reuse,sizeof(reuse)) == -1)
	{
		perror("setsockopt error");
		return -1;
	}

	/*
	//传输IP和端口号
	struct sockaddr_in sin;
	sin.sin_family = AF_INET;
	sin.sin_port = htons(PORT);
	sin.sin_addr.s_addr = inet_addr(IP);
	if(bind(sfd,(struct sockaddr*)&sin,sizeof(sin)) == -1)
	{
	perror("bind error");
	return -1;
	}
	printf("bind success\n");
	*/
	struct sockaddr_in cin;
	cin.sin_family = AF_INET;
	cin.sin_port = htons(SPORT);
	cin.sin_addr.s_addr = inet_addr(IP);

	if( connect(sfd, (struct sockaddr *)&cin,sizeof(cin)) ==-1)
	{
		perror("connet error");
		return -1;
	}

	char rbuf[5]={0xff,0x02,0x00,0,0xff};
	unsigned char bbuf[5]={0xff,0x02,0x01,90,0xff};
	send(sfd,rbuf,sizeof(rbuf),0);
	send(sfd,bbuf,sizeof(bbuf),0);

	while(1)
	{
		char flag;
		printf("请输入要控制的0|1>>>");
		scanf(" %c",&flag);
		getchar();
		switch(flag)
		{
		case 'a':
		case 'A':
			{
				rbuf[3] += 5; 
				if(rbuf[3] >= 90)
				{
					rbuf[3] = 90;
				}
				send(sfd, rbuf, sizeof(rbuf), 0);
			}break;
		case 'b':
		case 'B':
			{
				rbuf[3] -= 5; 
				if(rbuf[3] <= -90)
				{
					rbuf[3] = -90;
				}
				send(sfd, rbuf, sizeof(rbuf), 0);
			}break;
		case 'C':
		case 'c':
			{
				bbuf[3] += 5; 
				if(bbuf[3] >= 180)
				{
					bbuf[3] = 180;
				}

				send(sfd, bbuf, sizeof(bbuf), 0);
			}
			break;
		case 'D':
		case 'd':
			{
				bbuf[3] -= 5; 
				if(bbuf[3] <= 0)
				{
					bbuf[3] = 0;
				}
				send(sfd, bbuf, sizeof(bbuf), 0);
			}
			break;
		}
	}
		return 0;
}

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

查验身份证c语言

以下是一个简单的C语言程序&#xff0c;用于验证身份证号码的校验码&#xff1a; #include <stdio.h>#include <string.h>int main() { char id[19]; int i, weight[17] {7, 9, 10, 5, 8, 4, 2, 1, 6, 3, 7, 9, 10, 5, 8, 4, 2}; int sum 0; char c…

企业微信自动登录自定义系统

方法一&#xff1a;企业微信构造OAuth2链接跳转登录到自定义系统 企业微信自定义应用配置 构造网页授权链接 如果企业需要在打开的网页里面携带用户的身份信息&#xff0c;第一步需要构造如下的链接来获取code参数&#xff1a; https://open.weixin.qq.com/connect/oauth2/…

Elasticsearch 向量相似搜索

Elasticsearch 向量相似搜索的原理涉及使用密集向量(dense vector)来表示文档,并通过余弦相似性度量来计算文档之间的相似性。以下是 Elasticsearch 向量相似搜索的基本原理: 向量表示文档: 文档的文本内容经过嵌入模型(如BERT、Word2Vec等)处理,得到一个密集向量(den…

在openSUSE-Leap-15.5-DVD-x86_64中使用deepin-wine-6.0.0.62再使用微信3.9.5

在openSUSE-Leap-15.5-DVD-x86_64中使用deepin-wine-6.0.0.62再使用微信3.9.5 参考文章&#xff1a; 《记录-下fedora 33安装deepin qq和微信 &#xff0c;不需要安装deepinwine》 https://tieba.baidu.com/p/7279470269 《opensuse使用virtualbox安装win10》 https://blog.c…

简便实用:在 ASP.NET Core 中实现 PDF 的加载与显示

前言 在Web应用开发中&#xff0c;经常需要实现PDF文件的加载和显示功能。本文小编将为您介绍如何在ASP.NET Core中实现这一功能&#xff0c;以便用户可以在Web应用中查看和浏览PDF文件。 实现步骤 1&#xff09;在服务器端创建PDF 打开 Visual Studio 并创建新的 ASP. NET…

PDF转为图片

PDF转为图片 背景pdf展示目标效果 发展过程最终解决方案&#xff1a;python PDF转图片pdf2image注意&#xff1a;poppler 安装 背景 最近接了一项目&#xff0c;主要的需求就是本地的文联单位&#xff0c;需要做一个电子刊物阅览的网站&#xff0c;将民族的刊物发布到网站上供…

Apipost检测接口工具的基本使用方法

&#x1f440; 今天言简意赅的介绍一款和postman一样好用的后端接口测试工具Apipost 专门用于测试后端接口的工具&#xff0c;可以生成接口使用文档官方下载网站&#xff1a;http://www.apipost.cn 傻瓜式安装—>register->项目->创建项目->APIs->新建目录&…

什么是 DDoS ?如何识别DDoS?怎么应对DDOS攻击

什么是DDOS攻击 DDoS攻击&#xff08;Distributed Denial of Service Attack&#xff09;即分布式拒绝服务攻击&#xff0c;是一种利用分布式网络来发起大量的请求&#xff0c;占用目标服务器或网络资源的攻击行为。这种攻击方式可以瘫痪目标系统&#xff0c;导致其无法正常提供…

springboot学习笔记(一)

本期内容&#xff1a; 1.springboot安装 2.springboot Hello world 1.springboot安装&#xff1a; 参考&#xff1a; springboot安装 Spring boot简介及安装 a. eclipse中打开help-->Eclipse Marketplace b. 在search栏目下&#xff0c;输入&#xff1a;spring-tool-…

Redis原理之网络模型笔记

目录 1. 阻塞IO 2. 非堵塞IO 3. IO多路复用 ​3.1 select 3.2 poll 3.3 epoll 4. 信号驱动IO 5. 异步IO 6. Redis是单线程还是多线程 Redis采用单线程模型&#xff0c;这意味着一个Redis服务器在任何时刻都只会处理一个请求。Redis的网络模型涉及到阻塞I/O&#xff08;Blo…

一天吃透Redis面试八股文

目录&#xff1a; Redis是什么&#xff1f;Redis优缺点&#xff1f;Redis为什么这么快&#xff1f;讲讲Redis的线程模型&#xff1f;Redis应用场景有哪些&#xff1f;Memcached和Redis的区别&#xff1f;为什么要用 Redis 而不用 map/guava 做缓存?Redis 数据类型有哪些&…

java SpringCloud版本b2b2c鸿鹄云商平台全套解决方案

使用技术&#xff1a; Spring CloudSpring BootMybatis微服务服务监控可视化运营 B2B2C平台&#xff1a; 平台管理端(包含自营) 商家平台端(多商户入驻) PC买家端、手机wap/公众号买家端 微服务&#xff08;30个通用微服务如&#xff1a;商品、订单、购物车、个人中心、支…

【笑小枫的按步照搬系列】Windows下安装RabbitMQ,图文完整教程

笑小枫的专属目录 1. RabbitMq简介1.1 消息队列中间件简介1.2 什么是RabbitMQ 2. 安装准备工具2.1 百度网盘下载2.2 官网下载erlang2.3 GitHub下载RabbitMQ 3. 安装步骤3.1 erlang安装3.1.1 安装步骤图文讲解3.1.2 环境变量配置图文讲解 3.2 RabbitMq安装3.2.1 解压zip文件到执…

【LeetCode刷题笔记】位运算

231. 2 的幂 解题思路: 1. 除法 , 不断循环判断, 如果能被 2 整除,就不断除以 2 ,直到不能被 2 整除为止,最后结果如果是 1 ,说明可以除尽,是 2 的幂次方,否则就不是。 特判:

北斗三号短报文户外应急产品及应用方案

我国幅员辽阔物产丰富&#xff0c;各大地区生产线都有工人日夜躬耕投入生产&#xff0c;然而与无人区、无网络区域作业人员通信一直是难以解决的技术问题&#xff1b;通信链路不稳定、通信不畅&#xff0c;通信距离短&#xff0c;无法与无人区人员进行实时沟通&#xff0c;对于…

RabbitMQ 如何保证消息可靠性

RabbitMQ 如何保证消息可靠性 1. 保证生产者可靠1.1 生产者确认机制1.2 实现生产者确认1.2.1 开启生产者确认机制1.2.2 定义ReturnCallback1.3.3.定义ConfirmCallback 1.3 注意 2. 保证MQ可靠2.1 数据持久化2.1.1 交换机持久化2.1.2.队列持久化2.1.3 消息持久化2.1.4 注意 3. 保…

引领半导体划片机行业,实现钛酸锶基片切割的卓越效能

在当今快速发展的半导体行业中&#xff0c;博捷芯以其卓越的技术实力和精准的行业应用&#xff0c;脱颖而出&#xff0c;再次引领行业潮流。这次&#xff0c;他们将先进的BJX3356划片机技术应用于钛酸锶基片的切割&#xff0c;为半导体制造行业的进一步发展提供了强大的技术支持…

mysql中的server_id到底有什么用?详解mysql配置中的server_id配置项

当我们搭建MySQL集群时&#xff0c;自然需要完成数据库的主从同步来保证数据一致性。而主从同步的方式也分很多种&#xff0c;一主多从、链式主从、多主多从&#xff0c;根据你的需要来进行设置。但只要你需要主从同步&#xff0c;就一定要注意server-id的配置&#xff0c;否则…

YOLOv5改进 | TripletAttention三重注意力机制(附代码+机制原理+添加教程)

一、本文介绍 本文给大家带来的改进是Triplet Attention三重注意力机制。这个机制&#xff0c;它通过三个不同的视角来分析输入的数据&#xff0c;就好比三个人从不同的角度来观察同一幅画&#xff0c;然后共同决定哪些部分最值得注意。三重注意力机制的主要思想是在网络中引入…

Gitlab仓库推送到Gitee仓库的一种思路

文章目录 Gitlab仓库推送到Gitee仓库的一种思路1、创建Gitee的ssh公钥&#xff08;默认已有Gitlab的ssh公钥&#xff09;2、添加Gitlab远程仓库地址3、添加Gitee远程仓库地址4、拉取Gitlab远程仓库指定分支到本地仓库指定分支&#xff08;以test分支为例&#xff09;5、推送本地…