科林Linux6_网络

#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位验证码,后续的验证流程忽略

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

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

相关文章

【C++ —— 哈希】学习笔记 | 模拟实现封装unordered_map和unordered_set

文章目录 前言一、unordered系列关联式容器1.1 unordered_map1.2 unordered_set 二、底层结构2.1哈希概念&#xff08;哈希是一种算法思想&#xff09;2.2哈希冲突2.3 解决哈希冲突方法&#xff1a;1.直接定址法&#xff08;值和位置关系是唯一关系&#xff0c;每个人都有唯一位…

python画图:matpolt,设置图片尺寸,字体大小,副坐标轴,保存

文章重心: 写论文的时候,图片的大小,字体的大小,副坐标轴,这些都是很重要的因素,保存一下之前用过的画图代码单图多图(两个子图)堆叠柱状图两个Y轴的图问题: python保存的时候,我选择的是svg,但是这样图片会比较大,查重什么的需要把图片都删了(一般有文件大小限制…

网页出现为了更好的体验,请将手机竖过来

前言 网站:https://act.xinyue.qq.com/commercial/act/af93dc75d9fc541d4833f05e98a9f54b6pre/index.html 发现必须要手机端才可以,否则显示"为了更好的体验,请将手机竖过来"的提示信息 很好奇怎么做的,UA?发现更改UA后依旧显示,后面看代码就知道了 可以看到是通过…

单片机原理及技术(二)—— AT89S51单片机(一)(C51编程)

目录 一、AT89S51单片机的片内硬件结构 二、AT89S51的引脚功能 2.1 电源及时钟引脚 2.2 控制引脚 2.3 并行 I/O口引脚 三、AT89S51的CPU 3.1 运算器 3.1.1 算术逻辑单元&#xff08;ALU&#xff09; 3.1.2 累加器A 3.1.3 程序状态字寄存器&#xff08;PSW&#xff09…

【狂神说Java】Redis笔记以及拓展

一、Redis 入门 Redis为什么单线程还这么快&#xff1f; 误区1&#xff1a;高性能的服务器一定是多线程的&#xff1f; 误区2&#xff1a;多线程&#xff08;CPU上下文会切换&#xff01;&#xff09;一定比单线程效率高&#xff01; 核心&#xff1a;Redis是将所有的数据放在内…

数据结构 —— 栈 与 队列

1.栈 1.1栈的结构和概念 栈&#xff08;Stack&#xff09;是一种特殊的线性数据结构&#xff0c;它遵循后进先出&#xff08;LIFO&#xff0c;Last In First Out&#xff09;的原则。栈只允许在一端插入和删除数据&#xff0c;这一端被称为栈顶&#xff08;top&#xff09;&a…

第一节:Redis的数据类型和基本操作

最近整理了关于Redis的一些文档&#xff0c;分享给大家&#xff0c;后续会持续更新...... Redis的数据类型 字符串String String&#xff1a;字符串&#xff0c;可以存储String、Integer、Float型的数据&#xff0c;甚至是二进制数据&#xff0c;一个字符串最大容量是512M 列表…

Linux指令初识

ls:显示当前目录底下的指定文件或目录 ls -l更详细的信息 ls -a显示当前目录下的所有文件 命令中的选项可以一次传递多个 ,例如&#xff1a;ls -al 命令和选项有必须一个或多个空格 以.开头的文件&#xff0c;为隐藏文件ls -a可以看到,ls -l看不见 支持命令拼在一起&#…

【vue2配置】Vue Router

Vue Router官网 1、npm install vue-router4 2、创建模块&#xff0c;在src目录小创/views/map/MapIndex.vue模块和创router/index.js文件 3、在router/index.js配置路由 import Vue from "vue"; import Router from "vue-router"; // 引入模块 const Ma…

C++学习/复习5--构造函数与初始化/static成员/友元/内部类/匿名对象/编译器的拷贝构造优化

一、本章概要 二、再谈构造函数 1.构造体赋初值与初始化 2.初始化列表与初始化 2.1定义 2.2注意事项与举例 3.explicit关键字与构造函数 3.1隐式类型转换 也叫做自动类型转换 这种转换通常是从存储范围小的类型到存储范围大的类型&#xff0c;或者是从低精度的数值类型到高…

【编译原理--- 汇编、编译、解释系统】

汇编、编译、解释系统 1.编译方式和解释方式 程序种类是否生成目标程序是否参与程序的运行过程程序执行速度可移植性编译程序生成不参与快差解释程序不生成参与慢好 编译方式过程&#xff1a;词法分析、语法分析、语义分析、&#xff08;中间代码生成、代码优化、&#xff0…

【动手学强化学习】第 6 章 Dyna-Q 算法知识点总结

【动手学强化学习】第 6 章 Dyna-Q 算法知识点总结 本章知识点基于模型的强化学习与无模型的强化学习方法简介无模型的强化学习方法基于模型的强化学习方法 强化学习算法的评价指标Dyna-Q算法Dyna-Q 算法的具体流程Dyna-Q 代码实践 本章知识点 基于模型的强化学习与无模型的强…

opencv进阶 ——(四)图像处理之去高光

去高光步骤&#xff1a; 1、转换成灰度图 2、二值化图像&#xff0c;得到高光区域 3、进行膨胀操作&#xff0c;放大高光区域&#xff0c;以此得到高光蒙版 4、通过illuminationChange函数对高光区域消除高光

VMware安装Ubuntu系统(超详细)

一.Ubuntu官网下载镜像 Ubuntu官网&#xff1a;Enterprise Open Source and Linux | Ubuntu 二.安装Ubuntu系统 选择文件->创建虚拟机新建虚拟机&#xff08;ControlN&#xff09;&#xff0c;这里直接选择典型即可 选择稍后安装系统 选择linux Ubuntu 64位 填写虚拟机名称…

word一按空格就换行怎么办?word文本之间添加空格就换行怎么办?

如上图&#xff0c;无法在Connection和con之间添加空格&#xff0c;一按空格就会自动换行。 第一步&#xff1a;选中文本&#xff0c;打开段落。 第二步&#xff1a;点击中文版式&#xff0c;勾选允许西文在单词中间换行。 确定之后就解决一按空格就自动换行啦&#xff01;

基于STM32实现智能水族箱控制系统

目录 引言环境准备智能水族箱控制系统基础代码示例&#xff1a;实现智能水族箱控制系统 水温传感器数据读取水泵与加热器控制水位传感器数据读取用户界面与显示应用场景&#xff1a;水族箱管理与环境控制问题解决方案与优化收尾与总结 1. 引言 本教程将详细介绍如何在STM32嵌…

steam游戏服务器如何选择

steam游戏平台现在在国内市场很吃香&#xff0c;当我们自己开发的游戏想要上架steam我们需要准备什么&#xff0c;在选择服务器的时候我们又需要考虑哪些因素呢&#xff0c;该怎样选择一款适合自己游戏的服务器是很关键的 一.Steam服务器的配置选择 Steam专用服务器通常是指由…

【wiki知识库】01.wiki知识库前后端项目搭建(SpringBoot+Vue3)

&#x1f4dd;个人主页&#xff1a;哈__ 期待您的关注 &#x1f33c;环境准备 想要搭建自己的wiki知识库&#xff0c;要提前搭建好自己的开发环境&#xff0c;后端我使用的是SpringBoot&#xff0c;前端使用的是Vue3&#xff0c;采用前后端分离的技术实现。同时使用了Mysql数…

Spring Boot 3.0:未来企业应用开发的基石

文章目录 一、Spring Boot 3.0的核心特性二、Spring Boot 3.0的优势三、如何在项目中应用Spring Boot 3.01.更新项目依赖2.调整代码结构3.测试和部署 《学习Spring Boot 3.0》内容简介作者简介目录内容介绍 随着技术的飞速发展&#xff0c;企业应用开发的需求也在不断演变。Spr…

创客贴:极简高效的智能平面设计神器测评

给大家推荐一款智能平面设计作图软件——创客贴&#xff0c;简单来说&#xff0c;就是给那些需要频繁进行平面设计的人提供帮助的。它作为一款在线图片编辑器&#xff0c;可以免费使用&#xff0c;让你轻松进行创意设计。创客贴不仅提供了海量正版设计模板和图片素材&#xff0…