科林Linux6_网络

news2024/11/18 10:22:30
#include<sys/socket.h>
#include<arpa/inet.h>    //大小端转换
#include<netdb.h>    //DNS

一、Socket套接字

为了开发网络应用,系统提供一套API函数接口,用于网络应用开发,这些接口称为套接字函数

struct sockaddr_int{
    sin_family=AF_INET;
    sin_port=8080;
    sin_addr.s_addr=127.0.0.1;
}addr;

int sockfd=socket(AF_INET,SOCK_STREAM|SOCK_DRAM,0);    //socket创建
//成功返回sockfd,失败返回-1

bind(int sockfd,struct sockaddr* addr/*使用旧的网络信息结构体,向前兼容*/,socklen_t addrlen);
//成功返回0,失败返回-1。对socket设置自定义信息,保持信息不变

listen(sockfd,backlog/*等待连接队列大小,默认128*/);//监听连接过程以及对应的链接事件(TCPServer)
//成功返回0,失败返回-1

htons();    //本机到网络16位,小端转大端端口号
htonl();    //小端转大端p
ntohs();
ntohl();
inet_ntop();    //大端序转字符串
inet_pton();
inet_addr();
connect(int sockfd,struct sockaddr* destaddr,sockelen_t addrlen);    //请求连接函数(发起握手请求)
//成功返回0,失败返回-1,如果网络异常可能引发阻塞

int clientsock = accept(int serversocket,struct sockaddr* clientaddr,socklen_t* addrlen);    //阻塞等待并建立连接函数(完成三次握手),连接成功后立即返回
//成功返回sock,失败返回-1,如果网络异常可能引发阻塞

send(int sockfd,char* msg,int len,MSG_NOSIGNAL/*写忽略信号*/);    //向目标发送网络信息

recv(int sockfd,char* buffer,int size,MSG_DONTWAIT/*非阻塞读*/);    //读取接收网络信息

TCP连接方式:keep-alive长链接,close短链接

//TcpServer.h
#include<mysock.h>

#define SHUTDOWN 1

/*支持 tcp连接 及连接反馈的模型*/

int main(){
	//close 循环持续连接
	int server_sock,client_sock;
	struct sockaddr_in addrClient;
	socklen_t addrlen;
	server_sock=net_initializer();
	printf("Test tcp server version 1.0\n");
	char client_ip[16];
	while(SHUTDOWN){
		addrlen=sizeof(addrClient);
		client_sock=ACCEPT(server_sock,(struct sockaddr*)&addrClient,&addrlen);
		bzero(client_ip,16);
		inet_ntop(AF_INET,&addrClient.sin_addr.s_addr,client_ip,16);//大端序转字符串
		printf("client port %d,client ip %s\n",ntohs(addrClient.sin_port),client_ip);
		first_response(client_sock,client_ip);
		business(client_sock);//读取请求,处理请求,反馈响应
        close(client_sock);
	}
	close(server_sock);
	printf("server tis done\n");
	return 0;
}
//TcpClient.h
#include<mysock.h>

int main(){
	//创建套接字
	int server_sock=SOCKET(AF_INET,SOCK_STREAM,IPPROTO_TCP);
	//服务器套接字信息
	struct sockaddr_in addrServer;
	bzero(&addrServer,sizeof(addrServer));
	addrServer.sin_family=AF_INET;
	addrServer.sin_port=htons(8080);
	addrServer.sin_addr.s_addr=inet_addr("82.157.31.74");

	CONNECT(server_sock,(struct sockaddr*)&addrServer,sizeof(addrServer));
	
	int nRecvNum=0;
	int nSendNum=0;
	char recvBuf[1024]="";
	char sendBuf[1024]="";
	
	nRecvNum=RECV(server_sock,recvBuf,sizeof(recvBuf),0);
	printf("server:%s\n",recvBuf);

	fgets(sendBuf,sizeof(sendBuf),stdin);
	nSendNum=SEND(server_sock,sendBuf,sizeof(sendBuf),0);
		
	nRecvNum=RECV(server_sock,recvBuf,sizeof(recvBuf),0);
	printf("server:%s\n",recvBuf);

	close(server_sock);
	return 0;
}

  套接字函数的包裹,网络功能的包裹:在系统函数的基础上,拓展函数的功能,在函数的基础上包裹一层功能更丰富的函数

//myscok.h
#include<stdio.h>
#include<stdlib.h>
#include<unistd.h>
#include<string.h>
#include<sys/socket.h>
#include<arpa/inet.h>
#include<errno.h>
#include<ctype.h>
#include<time.h>

int SOCKET(int domain,int type,int protocol);
int BIND(int sockfd,const struct sockaddr* addr,socklen_t addrlen);
int LISTEN(int sockfd,int backlog);
int CONNECT(int sockfd,const struct sockaddr* addr,socklen_t addrlen);
int ACCEPT(int sockfd,struct sockaddr* addr,socklen_t* addrlen);
ssize_t RECV(int sockfd,void* buf,size_t len,int flags);
ssize_t SEND(int sockfd,const void* buf,size_t len,int flags);

int net_initializer();
void first_response(int sock,char* cip);

//业务处理模块
void business(int client_sock);
//mysock.c
#include<mysock.h>

int SOCKET(int domain,int type,int protocol){
	int sock;
	if((sock=socket(domain,type,protocol))==-1){
		perror("socket create failed");
		return -1;
	}
	return sock;
}

int BIND(int sockfd,const struct sockaddr* addr,socklen_t addrlen){
	if((bind(sockfd,addr,addrlen))==-1){
		perror("bind call failed");
		return -1;
	}
	return 0;
}

int LISTEN(int sockfd,int backlog){
	if((listen(sockfd,backlog))==-1){
		perror("listen call failed");
		return -1;
	}
	return 0;
}

int CONNECT(int sockfd,const struct sockaddr* addr,socklen_t addrlen){
	if((connect(sockfd,addr,addrlen))==-1){
		perror("connect call failed");
		return -1;
	}
	return 0;
}

int ACCEPT(int sockfd,struct sockaddr* addr,socklen_t* addrlen){
	int sock;
	if((sock=accept(sockfd,addr,addrlen))==-1){
		perror("accept call failed");
		return -1;
	}
	return sock;
}

ssize_t RECV(int sockfd,void* buf,size_t len,int flags){
	ssize_t size;
	if((size=recv(sockfd,buf,len,flags))==-1){
		if(errno==EAGAIN){
			printf("recv nonblock return\n");
		}
		else{
			perror("recv call failed");
		}
		return -1;
	}
	return size;
}

ssize_t SEND(int sockfd,const void* buf,size_t len,int flags){
	ssize_t size;
	if((size=send(sockfd,buf,len,flags))==-1){
		perror("send call failed");
		return -1;
	}
	return size;
}

int net_initializer(){
	//套接字信息
	struct sockaddr_in addrServer;
	bzero(&addrServer,sizeof(addrServer));
	addrServer.sin_family=AF_INET;
	addrServer.sin_port=htons(8080);
	addrServer.sin_addr.s_addr=htonl(INADDR_ANY);
	//创建套接字
	int server_sock;
	server_sock=SOCKET(AF_INET,SOCK_STREAM,0);
	BIND(server_sock,(struct sockaddr*)&addrServer,sizeof(addrServer));
	LISTEN(server_sock,128);
	return server_sock;
}

void first_response(int sock,char* cip){
	char response[1024];
	bzero(response,sizeof(response));
	sprintf(response,"hi, %s wellcome test TCP server.\n",cip);
	SEND(sock,response,strlen(response),0);
}

void business(int client_sock){
	//读取一次客户端请求,处理后,立刻断开
	ssize_t recv_size;
	char recv_buffer[1024];
	bzero(recv_buffer,sizeof(recv_buffer));
	recv_size=RECV(client_sock,recv_buffer,sizeof(recv_buffer),0);

	if((strcmp(recv_buffer,"time\n")==0) || (strcmp(recv_buffer,"time")==0)){
		//响应系统时间
		time_t tp;
		char tbuf[1024];
		bzero(tbuf,sizeof(tbuf));
		ctime_r(&tp,tbuf);
		SEND(client_sock,tbuf,strlen(tbuf),0);
		printf("server,response time success.\n");
		close(client_sock);
	}
	else{
		//数据处理,大小写转换 toupper()
		int cnt=0;
		while(cnt<recv_size){
			recv_buffer[cnt]=toupper(recv_buffer[cnt]);
			cnt++;
		}
		SEND(client_sock,recv_buffer,recv_size,0);
		printf("server,response data sucess.\n");
		close(client_sock);
	}
}

二、业务

简易业务:例子

客户端向服务端发送time关键字,服务器接收后,向客户端返回系统时间

简单数据处理,客户端向服务端发送字符串,服务端完成大小写转换,并回复

客户端向服务端发送手机号码,服务端向手机发送短信,并附带4位验证码,后续的验证流程忽略

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

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

相关文章

【STM32】计算定时器的溢出

TIM2、3、4、5、12、13、14在APB1上&#xff0c;最大计数频率84M。 TIM1、8、9、10、11在APB2上&#xff0c;最大计数频率168M。 time(arr1)/(prescale1)/Tclk 算出来的是秒 下图使用TIM14 84MHz 那么time33600*25000/8400000010S&#xff0c;10S进入一次中断 中断方式开…

【脚本篇】---spyglass lint脚本

目录结构 sg_lint.tcl &#xff08;顶层&#xff09; #1.source env #date set WORK_HOME . set REPORT_PATH ${WORK_HOME}/reports puts [clock format [clock second] -format "%Y-%m-%d %H:%M:%S"] #2.generate source filelist #3.set top module puts "##…

BFS 解决最短路问题

目录 一、前言 1.1 如何使用 BFS 找到最短路&#xff1a; 1.2 为什么不用 dfs &#xff1a; 二、模板套路 三、例题练习 3.1 例题1&#xff1a;迷宫中离入口最近的出口 3.2 例题2&#xff1a;最小基因变化 3.3 例题3&#xff1a;单词接龙 3.4 例题4&#xff1a;为高尔…

Springboot+Vue+ElementUI开发前后端分离的员工管理系统01--系统介绍

项目介绍 springboot_vue_emp是一个基于SpringbootVueElementUI实现的前后端分离的员工管理系统 功能涵盖&#xff1a; 系统管理&#xff1a;用户管理、角色管理、菜单管理、字典管理、部门管理出勤管理&#xff1a;请假管理、考勤统计、工资发放、工资统计、离职申请、个人资…

低频量化周报(指数分位值,指数风险溢价比,配债完整数据集,可转债策略)...

低频量化周报&#xff08;2024-05-25&#xff09; 指数分位值指数风险溢价比小规模配债<5亿配债完整数据 5 批文通过4 发哥通过3 交易所受理2 股东大会通过1 董事会预案可转债策略 双低策略四因子策略网格策略ETF抄底指标<3历史操作记录本周心得最后 指数分位值 指数名称…

秋招突击——算法打卡——5/25、5/26——寻找两个正序数组的中位数

题目描述 自我尝试 首先&#xff0c;就是两个有序的数组进行遍历&#xff0c;遍历到一半即可。然后求出均值&#xff0c;下述是我的代码。但这明显是有问题的&#xff0c;具体错误的代码如下。计算复杂度太高了&#xff0c;O&#xff08;n&#xff09;&#xff0c;所以会超时&…

2024年【高压电工】新版试题及高压电工找解析

题库来源&#xff1a;安全生产模拟考试一点通公众号小程序 高压电工新版试题是安全生产模拟考试一点通生成的&#xff0c;高压电工证模拟考试题库是根据高压电工最新版教材汇编出高压电工仿真模拟考试。2024年【高压电工】新版试题及高压电工找解析 1、【单选题】 110KV及以下…

C++课程设计:学校人员信息管理系统(可视化界面)

目录 学校人员信息管理系统 操作演示 MP4转GIF动图 设计功能要求 评分标准 QT Creator安装和新建项目 QT安装 QT新建项目 管理系统程序设计 mainwindow.h 文件 mainwindow.h 程序释义 mainwindow.cpp 文件 mainwindow.cpp 程序释义 main.h 文件 TXT文件生成 博主…

redis6.2.7 搭建一主多从

1、集群规划 节点端口角色192.168.137.1026379master192.168.137.1026380slave192.168.137.1036381slave 2、伪集群搭建 2.1 创建fake_cluster 目录存放 公共配置文件 # 进入redis目录 cd /app/apps/redis-6.2.7# 创建存放伪集群的目录 mkdir fake_cluster#复制redis.conf到…

东方通TongWeb结合Spring-Boot使用

一、概述 信创需要; 原状:原来的服务使用springboot框架,自带的web容器是tomcat,打成jar包启动; 需求:使用东方通tongweb来替换tomcat容器; 二、替换步骤 2.1 准备 获取到TongWeb7.0.E.6_P7嵌入版 这个文件,文件内容有相关对应的依赖包,可以根据需要来安装到本地…

【Qt 学习笔记】Qt窗口 | 菜单栏 | QMenuBar的使用及说明

博客主页&#xff1a;Duck Bro 博客主页系列专栏&#xff1a;Qt 专栏关注博主&#xff0c;后期持续更新系列文章如果有错误感谢请大家批评指出&#xff0c;及时修改感谢大家点赞&#x1f44d;收藏⭐评论✍ Qt窗口 | 菜单栏 | QMenuBar的使用及说明 文章编号&#xff1a;Qt 学习…

顺序栈的实现

顺序栈是用数组实现的&#xff1a;&#xff08;假设我们有8个位置&#xff08;下标0-7&#xff09;&#xff09; #include<stdio.h> #include<malloc.h> #include<assert.h> #include <iostream> #define MAX_SIZE 8#define Elemtype int typedef str…

Android 配置 Kapt 编译器插件

以 Android Studio 2023.3.1 最新版本为准。 步骤1:打开版本信息配置文件 找到libs.versions.toml文件。 这是打开后的样子&#xff1a; 步骤2&#xff1a;配置版本信息 你需要在[plugins]下面添加一条kapt的配置信息&#xff1a; 要添加的配置信息如下&#xff1a; jetbr…

YOLOv8_pose的训练、验证、预测及导出[关键点检测实践篇]

1.关键点数据集划分和配置 从上面得到的数据还不能够直接训练,需要按照一定的比例划分训练集和验证集,并按照下面的结构来存放数据,划分代码如下所示,该部分内容和YOLOv8的训练、验证、预测及导出[目标检测实践篇]_yolov8训练测试验证-CSDN博客是重复的,代码如下: …

粒子辐照环境中相机镜头防护及LabVIEW图像处理注意事项

在粒子辐照环境测试电路板性能的实验中&#xff0c;需要对相机镜头进行有效防护&#xff0c;同时利用LabVIEW进行图像识别和处理。本文将讨论相机镜头防护的关键因素和LabVIEW处理过程中的注意事项&#xff0c;包括防辐射材料选择、辐射屏蔽措施、散热管理、空间布局及LabVIEW软…

CorelCAD v2022.5 解锁版 安装教程(2D制图 3D设计和打印的简化软件)

前言 CorelCAD&#xff0c;加拿大Corel公司开发的一款适用于2D制图、3D设计和打印的简化版CAD软件。它是款专业的2D制图和3D设计软件&#xff0c;拥有行业标准文件兼容性&#xff0c;支持 .DWG、.STL、.PDF、 .CDR*等文件格式&#xff0c;轻松实现协作和项目共享&#xff0c;利…

6818 android 修改开机 logo, 编译脚本分析

问题&#xff1a; 客户需要去掉 android5.1 的开机logo. 说明&#xff1a; 对于Android5.1 来说&#xff0c;uboot 与kernel 的logo 是一个。 过程&#xff1a; 其实对于开机logo 的修改很简单&#xff0c;直接参考厂家手册就可以了。 这是 android4.4 的开机logo 的修改&…

Qt | QStackedLayout 类(分组布局或栈布局)、QStackedWidget

01、QStackedLayout 类 1、使用 QStackedLayout 可以实现一个多页面切换的界面,多 页面切换就是类似于选项卡(如右图)类型的界面。 2、QStackedLayout 并没有直接实现多页面切换的办面,只是我们可以通过该类实现多页面切 换的功能,因此要使用 QStackedLayout 类实现多面面…

LeetCode 第399场周赛个人题解

100323. 优质数对的总数 I 原题链接 100323. 优质数对的总数 I 思路分析 签到题 AC代码 class Solution:def numberOfPairs(self, nums1: List[int], nums2: List[int], k: int) -> int:n, m len(nums1), len(nums2)ret 0for i in range(n):for j in range(m):if nu…

GDPU JavaWeb mvc模式

搭建一个mvc框架的小实例。 简易计算器 有一个名为inputNumber.jsp的页面提供一个表单&#xff0c;用户可以通过表单输入两个数和运算符号提交给Servlet控制器&#xff1b;由名为ComputerBean.java生成的JavaBean负责存储运算数、运算符号和运算结果&#xff0c;由名为handleCo…