当前位置: 首页 > news >正文

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

相关文章:

  • 机器人物理引擎
  • Slash后台管理系统源码阅读笔记 后面面板中的折线图统计卡片是怎么实现的?
  • Linux 基本使用和 web 程序部署云端
  • 【Linux】Ubuntu系统挂载NAS文件夹
  • 问题排查复盘
  • C++第十九弹---string模拟实现(下)
  • Python语法(全)
  • 南京观海微电子----升压和降压模块电路解析
  • web及网络基础图文详解
  • 内网渗透(不出网上线CS)
  • HCIP-Datacom-ARST自选题库__BGP/MPLS IP VPN单选【21道题】
  • 【教程】Linux部署Android安卓模拟器
  • 蓝桥杯练习系统(算法训练)ALGO-934 序列
  • 文件批量重命名利器:一键轻松替换文本间内容,高效管理文件不再是难题!
  • 【LLM多模态】综述Visual Instruction Tuning towards General-Purpose Multimodal Model
  • 分享一款快速APP功能测试工具
  • 【跃迁之路】【669天】程序员高效学习方法论探索系列(实验阶段426-2018.12.13)...
  • Android优雅地处理按钮重复点击
  • Babel配置的不完全指南
  • conda常用的命令
  • Facebook AccountKit 接入的坑点
  • java2019面试题北京
  • JS题目及答案整理
  • laravel5.5 视图共享数据
  • Objective-C 中关联引用的概念
  • 规范化安全开发 KOA 手脚架
  • 如何胜任知名企业的商业数据分析师?
  • 时间复杂度与空间复杂度分析
  • 《TCP IP 详解卷1:协议》阅读笔记 - 第六章
  • # Panda3d 碰撞检测系统介绍
  • #[Composer学习笔记]Part1:安装composer并通过composer创建一个项目
  • #{} 和 ${}区别
  • (3)llvm ir转换过程
  • (c语言版)滑动窗口 给定一个字符串,只包含字母和数字,按要求找出字符串中的最长(连续)子串的长度
  • (PySpark)RDD实验实战——取一个数组的中间值
  • (苍穹外卖)day03菜品管理
  • (区间dp) (经典例题) 石子合并
  • (四)鸿鹄云架构一服务注册中心
  • (一)RocketMQ初步认识
  • (原創) 博客園正式支援VHDL語法著色功能 (SOC) (VHDL)
  • (转)nsfocus-绿盟科技笔试题目
  • (最简单,详细,直接上手)uniapp/vue中英文多语言切换
  • .cfg\.dat\.mak(持续补充)
  • .NET Core中的时区转换问题
  • .NET Windows:删除文件夹后立即判断,有可能依然存在
  • .NET 应用架构指导 V2 学习笔记(一) 软件架构的关键原则
  • .net分布式压力测试工具(Beetle.DT)
  • .secret勒索病毒数据恢复|金蝶、用友、管家婆、OA、速达、ERP等软件数据库恢复
  • @31省区市高考时间表来了,祝考试成功
  • @Autowired @Resource @Qualifier的区别
  • @cacheable 是否缓存成功_Spring Cache缓存注解
  • @EventListener注解使用说明
  • []Telit UC864E 拨号上网
  • [C/C++] C/C++中数字与字符串之间的转换
  • [cvpr 2024 目标检测 前沿研究 热点] cpvr 2024中与目标检测主题有关的论文