科林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,失败返回-1bind(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.mzph.cn/web/15864.shtml

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

相关文章

数据库管理-第194期 网络加速RDMA初探(20240526)

数据库管理194期 2024-05-26 数据库管理-第194期 网络加速RDMA初探&#xff08;20240526&#xff09;1 概念2 发展3 使用总结 数据库管理-第194期 网络加速RDMA初探&#xff08;20240526&#xff09; 作者&#xff1a;胖头鱼的鱼缸&#xff08;尹海文&#xff09; Oracle ACE A…

英文 海量的学习句子比单独的记单词效果要好,格句致知。

英文 海量的学习句子比单独的记单词效果要好 句子有上下文、场景和时态等&#xff0c;能形成剧情&#xff0c;变得生动有趣。 如果一句没听懂&#xff0c;还继续听就是浪费时间了。要一句一句地深究&#xff0c;不然就要读好几遍&#xff0c;还得背诵。要深入理解&#xff0c…

不同的二叉搜索树(II)题解

toc &#x1f91a;我的博客 欢迎光临我的博客&#xff1a;https://blog.csdn.net/qq_52434217?typeblog &#x1f95b;前言 动态规划是常见的算法思路&#xff0c;动态规划在计算过程中保存了部分计算结果到内存中&#xff0c;以便于在进行下一次计算时可以直接从内存中获…

Ubuntu部署Dolphinscheduler单机版并配置PG数据库

1、下载并解压Dolphinscheduler DolphinScheduler | 下载 (apache.org) 下载完成后得tar.gz包 下载稳定版 下载稳定版 下载稳定版 tar -zxvf apache-dolphinscheduler-3.1.9-alpha-bin.tar.gz mv apache-dolphinscheduler-3.1.9-alpha-bin dolphinscheduler-bin cd dolph…

【Text2SQL】Spider 数据集

论文&#xff1a;Spider: A Large-Scale Human-Labeled Dataset for Complex and Cross-Domain Semantic Parsing and Text-to-SQL Task ⭐⭐⭐⭐⭐ EMNLP 2018, arXiv:1809.08887 Dataset: spider GitHub: github.com/taoyds/spider 一、论文速读 本文提出了 Text2SQL 方向的…

1.4 Mac 电脑 Clion 安装教程

目录 1 安装 2 激活 3 汉化 1 安装 去 https://www.jetbrains.com/clion/download/other.html 下载: 也可以直接到链接进行下载:https

嵌入式全栈开发学习笔记---C语言笔试复习大全23

目录 联合体 联合体的定义 联合体的长度 如果来判断设备的字节序&#xff1f; 如何把大端数据转换成小端数据&#xff1f; 枚举 枚举的定义 上一篇复习了结构体&#xff0c;这一节复习联合体和枚举。 说明&#xff1a;我们学过单片机的一般都是有C语言基础的了&#xff…

docker镜像容器搭建nominatim地理编码服务

1、下载地图pbf文件: https://planet.openstreetmap.org/ 2、nominatim官网 https://nominatim.org/release-docs/latest/admin/Installation/ 3、地图文件打包&#xff1a; docker run -it --shm-size20g \ -e PBF_PATH/nominatim/data/china-latest.osm.pbf \ -e REPLIC…

C语言PTA练习题:三角形类别,输入三角形三条边,求面积,四则计算器,猴子吃桃

7-1 三角形类别 输入三个整数&#xff0c;以这三个数为边长&#xff0c;判断是否构成三角形&#xff1b;若不能输出"no"&#xff0c;若构成三角形&#xff0c;进一步判断它们构的是&#xff1a;锐角三角形或直角三角形或钝角三角形.分别输出"ruijiao",&qu…

GitLens或者Git Graph在vscode中对比文件历史变化,并将历史变化同步到当前文件中

有时候我们上周改的代码&#xff0c;现在想反悔把它恢复过来&#xff0c;怎么办&#xff1f;&#xff1f;&#xff1f;很好&#xff0c;你有这个需求&#xff0c;说明你找对人了&#xff0c;那就是我们需要在vscode中安装这个插件&#xff1a;GitLens或者Git Graph&#xff0c;…

门禁-jenkins的构建状态同步到gitlab提交流水线

API接口文档 https://docs.gitlab.cn/jh/api/commits.html 配置pipline流水线 生成http请求代码&#xff1a; 使用HttpRequest插件生成 - sharelibs内容 //这是share libs里的 package devopsdef httpReq(reqType, reqUrl, reqBody, accessToken){def gitServer "…

有一个3x4的矩阵,要求用函数编写程序求出其中值最大的那个元素,以及其所在的行号和列号

常量和变量可以用作函数实参&#xff0c;同样数组元素也可以作函数实参&#xff0c;其用法与变量相同。数组名也可以作实参和形参&#xff0c;传递的是数组的起始地址。 用数组元素作函数实参&#xff1a; 由于实参可以是表达式&#xff0c;而数组元素可以是表达式的组…

Oracle 12C开机自启动

Oracle 12C设置开机自启动 1、本文内容 背景说明检查Oracle当前环境修改配置文件/etc/oratab添加数据库启动脚本dbstart 2、背景说明 最近因上线新的两套系统&#xff0c;增加4套测试环境&#xff0c;由于昨晚机房电路故障&#xff0c;部分物理服务器需要关键&#xff0c;电…

2000 年至 2015 年中国(即水稻、小麦和玉米1km 网格)三种主要作物年收获面积的时空变化

摘要 可靠、连续的主要作物收获面积信息对于研究地表动态和制定影响农业生产、土地利用和可持续发展的政策至关重要。然而&#xff0c;中国目前还没有高分辨率的空间明确和时间连续的作物收获面积信息。全国范围内主要农作物收获面积的时空格局也鲜有研究。在本研究中&#xf…

2024年【熔化焊接与热切割】考试内容及熔化焊接与热切割考试报名

题库来源&#xff1a;安全生产模拟考试一点通公众号小程序 熔化焊接与热切割考试内容考前必练&#xff01;安全生产模拟考试一点通每个月更新熔化焊接与热切割考试报名题目及答案&#xff01;多做几遍&#xff0c;其实通过熔化焊接与热切割复审模拟考试很简单。 1、【单选题】…

Django的模型层——2模型实例

1. 类的属性 objects&#xff1a;是Manager类型的对象&#xff0c;用于与数据库进行交互 当定义模型类时没有指定管理器&#xff0c;则Django会为模型类提供一个名为objects的管理器 支持明确指定模型类的管理器 class BookInfo(models.Model):...books models.Manager()当为…

C# 运算符重载的技术深入分析

C# 运算符重载的技术深入分析 一、引言 在C#中&#xff0c;运算符重载是一个允许开发者自定义类或结构中特定运算符行为的特性。通过这个特性&#xff0c;可以为自定义类型创建与内置类型一致的语义&#xff0c;使得代码更直观、更易理解。 二、运算符重载基础 2.1 定义和概…

网络安全从入门到精通(特别篇I):应急响应之网站入侵排查思路

蓝队应急响应实战 1. 应急响应-网站入侵-基础知识2. 应急响应-网站入侵-技能掌握3. 应急响应-网站入侵-案例分析3.1 网站入侵-排查思路-首要任务3.2 IIS&.NET-注入-基于时间配合日志分析3.3 Apache&PHP-漏洞-基于漏洞配合日志分析3.4 Tomcat&JSP-弱口令-基于后门配…

SpringBoot【1】集成 Druid

SpringBoot 集成 Druid 前言创建项目修改 pom.xml 文件添加配置文件开发 java 代码启动类 - DruidApplication配置文件-propertiesDruidConfigPropertyDruidMonitorProperty 配置文件-configDruidConfig 控制层DruidController 运行验证Druid 的监控应用程序 前言 JDK版本&…