TCP/IP网络协议通信函数接口
创建套接字函数 socket
#include <sys/types.h>#include <sys/socket.h>
int socket(int domain, int type, int protocol);
#define AF_UNSPEC PF_UNSPEC
#define AF_LOCAL PF_LOCAL
#define AF_UNIX PF_UNIX
#define AF_FILE PF_FILE
#define AF_INET PF_INET
#define AF_AX25 PF_AX25
#define AF_IPX PF_IPX
#define AF_APPLETALK PF_APPLETALK
#define AF_NETROM PF_NETROM
#define AF_BRIDGE PF_BRIDGE
#define AF_ATMPVC PF_ATMPVC
#define AF_X25 PF_X25
#define AF_INET6 PF_INET6
#define AF_ROSE PF_ROSE
#define AF_DECnet PF_DECnet
#define AF_NETBEUI PF_NETBEUI
#define AF_SECURITY PF_SECURITY
#define AF_KEY PF_KEY
#define AF_NETLINK PF_NETLINK
#define AF_ROUTE PF_ROUTE
#define AF_PACKET PF_PACKET
#define AF_ASH PF_ASH
#define AF_ECONET PF_ECONET
#define AF_ATMSVC PF_ATMSVC
#define AF_RDS PF_RDS
#define AF_SNA PF_SNA
#define AF_IRDA PF_IRDA
#define AF_PPPOX PF_PPPOX
#define AF_WANPIPE PF_WANPIPE
#define AF_LLC PF_LLC
#define AF_IB PF_IB
#define AF_MPLS PF_MPLS
#define AF_CAN PF_CAN
#define AF_TIPC PF_TIPC
#define AF_BLUETOOTH PF_BLUETOOTH
#define AF_IUCV PF_IUCV
#define AF_RXRPC PF_RXRPC
#define AF_ISDN PF_ISDN
#define AF_PHONET PF_PHONET
#define AF_IEEE802154 PF_IEEE802154
#define AF_CAIF PF_CAIF
#define AF_ALG PF_ALG
#define AF_NFC PF_NFC
#define AF_VSOCK PF_VSOCK
#define AF_KCM PF_KCM
#define AF_QIPCRTR PF_QIPCRTR
#define AF_SMC PF_SMC
#define AF_MAX PF_MAX
type 可选字段:
error 字段:
int sockfd = socket ( AF_INET , SOCK_STREAM , 0 );
int sockfd = socket ( AF_INET , SOCK_DGRAM , 0 );
int sockfd = socket ( PF_UNIX , SOCK_STREAM , 0 );
网络地址结构体 sockaddr
/* 描述通用套接字地址的结构 */
struct sockaddr
{__SOCKADDR_COMMON (sa_); /* 常用数据:地址族和长度. */char sa_data[14]; /* 地址数据. */
};
socket 中所有的函数都是使用上面的结构来表示一个地址(可以任意协议族的地址)
IPV4 的地址信息结构体为:
struct sockaddr_in {__kernel_sa_family_t sin_family; /*指定的协议族,AF_INTE*/__be16 sin_port; /* 端口号(网络字节序)*/struct in_addr sin_addr; /*IP 地址*//*填充到结构 sockaddr 的大小,保证所有协议的地址结构体都可以使用 socket 表示. */unsigned char __pad[__SOCK_SIZE__ - sizeof(short int) -sizeof(unsigned short int) - sizeof(struct in_addr)];
};
其中:
struct in_addr {__be32 s_addr; //IP 地址,in_addr_t 类型,32 位无符号整型
};
使用上面结构体需要的头文件为:
#include <arpa/inet.h>#include <netinet/in.h> // 为了使用 IPV4 地址结构体
本地通信的地址信息结构体为:
struct sockaddr_un {__kernel_sa_family_t sun_family; /* 协议族,AF_UNIX */char sun_path[UNIX_PATH_MAX]; /* 路径名,因为本地通信就是进程间通信,没有 IP 地址一言,所以需要一个计算机中的目录路径,就像 ftok 通过路径名获取 key 一样 */
};
使用上面结构体需要的头文件为:
#include <arpa/inet.h>#include <netinet/un.h> // 为了使用 IPV4 地址结构体
点分式 IP 地址转 in_addr
点分式 ip 转换成 in_addr 类型(inet_aton)
#include <sys/socket.h>
#include <netinet/in.h>
#include <arpa/inet.h>
int inet_aton(const char *cp, struct in_addr *inp);
struct sockaddr_in saddr ;inet_aton ( "192.168.41.243" , & saddr . sin_addr );
点分式 ip 转换 in_addr_t 类型(inet_addr)
#include <sys/socket.h>
#include <netinet/in.h>
#include <arpa/inet.h>
in_addr_t inet_addr(const char *cp);
struct sockaddr_in Saddr; //保存服务器的地址信息的结构体
memset(&Saddr,0,sizeof(struct sockaddr_in)); //清空结构体
Saddr.sin_family = AF_INET; //协议族,AF_INET 表示使用 IPV4 的协议族
Saddr.sin_port = htons(atoi(argv[2])); //端口号,但是要求的是网络字节序
Saddr.sin_addr.s_addr = inet_addr(argv[1]); //32bit 的一个 IP 地址
点分式 ip 转换 in_addr_t 类型(inet_network)
#include <sys/socket.h>
#include <netinet/in.h>
#include <arpa/inet.h>
in_addr_t inet_network(const char *cp);
适用与 IPV6 协议的 ip 转换(inet_pton)
#include <arpa/inet.h>
int inet_pton(int af, const char *src, void *dst);
网络 IP 转点分式
in_addr 结构体类型 ip 转点分式(inet_ntoa)
#include <sys/socket.h>
#include <netinet/in.h>
#include <arpa/inet.h>
printf ( "[ %s ] \n " , inet_ntoa ( addr . sin_addr ));
适用与 IPV6 协议的 ip 转换(inet_pton)
#include <arpa/inet.h>
const char *inet_ntop(int af, const void *src, char *dst, socklen_t size);
inet_makeaddr()函数,inet_lnaof()函数和 inet_netof()函数
inet_makeaddr 函数
#include <sys/socket.h>
#include <netinet/in.h>
#include <arpa/inet.h>
struct in_addr inet_makeaddr(int net,int host)
unsigned long net,host;
net = 0x0000007F;
host = 0x00000001;
struct in_addr ip = inet_makeaddr(net,host);
主机地址提取函数 inet_lnaof
#include <sys/socket.h>
#include <netinet/in.h>
#include <arpa/inet.h>
in_addr_t inet_lnaof(struct in_addr in)
const char * addr = "127.0.0.1" ;unsigned long ip = inet_network ( addr );unsigned long host_id = inet_lnaof ( ip );
网络地址提取函数 inet_netof
#include <sys/socket.h>
#include <netinet/in.h>
#include <arpa/inet.h>
in_addr_t inet_netof(struct in_addr in)
const char * addr = "127.0.0.1" ;unsigned long ip = inet_network ( addr );unsigned long network_id = inet_netof ( ip );
主机字节序和网络字节序之间的转换 API
在 linux 中提供了下面四个函数用于网络字节序和主机字节序之间的转换。
32 位主机字节序转网络字节序(htonl)
#include <arpa/inet.h>
uint32_t htonl(uint32_t hostlong);
16 位主机字节序转网络字节序(htons)
#include <arpa/inet.h>
uint16_t htons(uint16_t hostlong);
address . sin_port = htons ( atoi (port)); // 将端口号 port 转换为网络字节序
32 位网络字节序转主机字节序(ntohl)
#include <arpa/inet.h>
uint32_t ntohl(uint32_t netlong);
16 位网络字节序转主机字节序(ntohs)
#include <arpa/inet.h>
uint16_t ntohs(uint16_t netlong);
printf ( " 客户端 IP: %s , 客户端 Port: %d \n " , inet_ntoa ( caddr . sin_addr ), ntohs ( caddr . sin_port ));
服务器绑定(bind)
#include <sys/types.h>
#include <sys/socket.h>
int bind(int sockfd, const struct sockaddr *addr,socklen_t addrlen);
【函数功能】 //2.绑定一个通信 IP 地址(作为服务器本身的 IP)
struct sockaddr_in saddr; //保存服务器的地址(IP+port)
memset(&saddr,0,sizeof(struct sockaddr_in)); //清空结构体
saddr.sin_family = AF_INET;
inet_aton(argv[1], &saddr.sin_addr);
saddr.sin_port = htons(atoi(argv[2]));
int ret = bind(sockfd,(struct sockaddr *)&saddr,sizeof(saddr));
if(ret == -1)
{perror("bind error");exit(-1);
}
服务器监听函数(listen)
#include <sys/types.h>
#include <sys/socket.h>
int listen(int sockfd, int backlog);
listen ( sockfd , 250 );
等待客户连接函数(accept)
#include <sys/types.h>
#include <sys/socket.h>
int accept(int sockfd, struct sockaddr *addr, socklen_t *addrlen);
struct sockaddr_in caddr ; // 保存客户端的地址 (IP+port)socklen_t len = sizeof ( caddr );int confd = accept (sockfd,( struct sockaddr * ) & caddr , & len );
请求服务器连接函数(connect)
#include <sys/types.h>
#include <sys/socket.h>
int connect(int sockfd, const struct sockaddr *addr, socklen_t addrlen);
struct sockaddr_in Saddr; //保存服务器的地址信息的结构体
memset(&Saddr,0,sizeof(struct sockaddr_in)); //清空结构体
Saddr.sin_family = AF_INET; //协议族,AF_INET 表示使用 IPV4 的协议族
Saddr.sin_port = htons(atoi(3456));//端口号,但是要求的是网络字节序
Saddr.sin_addr.s_addr = inet_addr("192.168.41.234");
int r = connect(sock,(struct sockaddr *)&Saddr,sizeof(Saddr));
if(r == -1) //连接失败
{perror("connect error");return -1;
}
网络消息发送 API
使用 write 发送
ssize_t write ( int fd, const void * buf, size_t count);
char buf[1024] = {0};
memset(buf,0,sizeof(buf));
scanf("%[^\n]",buf);
printf("%ld\n",strlen(buf));
int ret = write(sock,buf,strlen(buf));
if(ret <= 0)
{perror("sendto error");return -1;
}
使用 writev 发送
#include <sys/uio.h>
ssize_t writev(int fd, const struct iovec *iov, int iovcnt);
struct iovec{void * iov_base ; // 内容的地址__kernel_size_t iov_len ; // 偏移量};
struct iovec iv [ 2 ];iv [ 0 ].iov_base = header_buf;iv [ 0 ].iov_len = strlen ( header_buf );iv [ 1 ].iov_base = file_buf;iv [ 1 ].iov_len = file_stat.st_size;ret = writev (confd, iv , 2 );
使用 send 发送
#include <sys/types.h>
#include <sys/socket.h>
ssize_t send(int sockfd, const void *buf, size_t len, int flags);
ret = send ( sockfd , "nishiliangzaiya" , 15 , 0 );
使用 sendto 发送
#include <sys/types.h>
#include <sys/socket.h>
ssize_t sendto(int sockfd, const void *buf, size_t len,int flags,const struct sockaddr *dest_addr, socklen_t addrlen);
ret = sendto (sockfd, "nishiliangzaima" , 15 , 0 , NULL , 0 );if (ret == - 1 ){perror ( "sendto error" );}
char buf [ 1024 ] = { 0 };fgets ( buf , 1024 , stdin );int ret = sendto ( sockfd , buf , strlen ( buf ), 0 ,( struct sockaddr * ) & addr , sizeof ( addr ));
使用 sendmsg 发送
#include <sys/types.h>
#include <sys/socket.h>
ssize_t sendmsg(int sockfd, const struct msghdr *msg, int flags);
struct msghdr
{void *msg_name; /* 发送/接收方的协议地址 */socklen_t msg_namelen; /* 地址数据长度 */struct iovec *msg_iov; /* 要发送/接收的数据向量*/size_t msg_iovlen; /*向量中的元素数。*/void *msg_control; /*辅助数据(例如 BSD 文件传递)*/size_t msg_controllen; /*辅助数据缓冲区长度。*/int msg_flags; /* 接收到的消息上的标志。忽略 */
};
读取网络消息 API
使用 read 读取
ssize_t read ( int fd, void * buf, size_t count);
char buf [ 1024 ];memset ( buf , 0 , sizeof ( buf ));int ret = read ( client , buf , sizeof ( buf ));
使用 readv 读取
#include <sys/uio.h>
ssize_t readv(int fd, const struct iovec *iov, int iovcnt);
struct iovec{void * iov_base ; // 内容的地址__kernel_size_t iov_len ; // 偏移量};
使用 recv 读取
#include <sys/types.h>
#include <sys/socket.h>
ssize_t recv(int sockfd, void *buf, size_t len, int flags);
使用 recvfrom 读取
#include <sys/types.h>
#include <sys/socket.h>
ssize_t recvfrom(int sockfd, void *buf, size_t len, int flags,struct sockaddr *src_addr, socklen_t *addrlen);
// 读取服务器的回复消息 -UDP 读取memset (buf, 0 , 1024 );struct sockaddr_in src_addr ; // 保存消息发送方的地址 (IP+port)memset ( & src_addr, 0 , sizeof ( struct sockaddr_in)); // 清空结构体socklen_t src_len = sizeof ( src_addr ); // 保存可用大小recvfrom (sockfd,buf, 1024 , 0 ,( struct sockaddr * ) & src_addr , & src_len );
使用 recvmsg 读取
#include <sys/types.h>
#include <sys/socket.h>
ssize_t recvmsg(int sockfd, struct msghdr *msg, int flags);
struct msghdr{void * msg_name ; /* 发送 / 接收方的协议地址 */socklen_t msg_namelen ; /* 地址数据长度 */struct iovec * msg_iov ; /* 要发送 / 接收的数据向量 */size_t msg_iovlen ; /* 向量中的元素数。 */void * msg_control ; /* 辅助数据 ( 例如 BSD 文件传递 )*/size_t msg_controllen ; /* 辅助数据缓冲区长度。 */int msg_flags ; /* 接收到的消息上的标志。忽略 */};
[flags]: 发送标志,一般为 0,也可以是几个宏的组合值
连接断开函数 shutdown
#include <sys/socket.h>
int shutdown(int sockfd, int how);
相关文章:

TCP/IP网络协议通信函数接口
创建套接字函数 socket 【头文件】 #include <sys/types.h> #include <sys/socket.h> 【函数原型】 int socket(int domain, int type, int protocol); 【函数功能】 socket 函数创建一个通信端点,并返回一个引用该端点的文件描述符,…...

go语言判断管道是否关闭的误区
前言 本文是探讨的是"在Go语言中,我们是否可以使用读取管道时的第二个返回值来判断管道是否关闭?" 样例 在Go语言中,我们是否可以使用读取管道时的第二个返回值来判断管道是否关闭? 可以看下面的代码 package mainimport "fmt"…...

如何轻松使用 ChatGPT 进行论文大纲和创作
ChatGPT能够编写复杂的代码、博客文章等,它可以帮助我们做很多事情。今天本篇文章分享的主要内容如何利用 ChatGPT 来撰写论文文章。下面会介绍如何轻松使用 ChatGPT 进行论文大纲和创作! 1、使用 ChatGPT 确定主题 文章非常重要的一个部分就是主题。如…...

【深蓝学院】手写VIO第6章--视觉前端--笔记
第5章相关内容,还是CSDN的传统Markdown编辑器好用。 视觉前段在14讲课程中已经讲过,这里再简单复习一下。 1. 前端工作的定性比较,分析 这一节讲了很多关于前端的方法框架的对比讨论,后面看完了相关的论文之后强烈建议再回来听一…...

用例图 UML从入门到放弃系列之三
1.说明 关于用例图,这篇文章我将直接照搬罗伯特.C.马丁老爷子在《敏捷开发》一书种的第17章,并配上自己的理解,因为这一章写的实在是太精彩了,希望能够分享给大家,共勉。以下是老爷子的原文中文翻译以及豆芽的个人解读…...

NLP大模型
大模型 1、大模型的模型结构 一般指一亿参数以上的模型。 目前以Transformer为基础自回归生成大致可以分为三种架构: Encoder-only的模型,如BERT Encoder-Decoder的模型,如T5。 Decoder-Only的模型,如GPT系列。...

Python- 将一个字符串列表连接成一个单独的字符串
Python中一个常用的技巧:将一个字符串列表连接成一个单独的字符串。 ,.join(list) 是使用Python的 str.join() 方法。 详细解析: join() 方法: 是一个字符串方法,意味着在一个字符串上调用它。它需要一个参数,通常是一个列表或任…...

深眸科技自研AI视觉分拣系统,实现物流行业无序分拣场景智慧应用
在机器视觉应用环节中,物体分拣是建立在识别、检测之后的一个环节,通过机器视觉系统对图像进行处理,并结合机械臂的使用实现产品分类。 通过引入视觉分拣技术,不仅可以实现自动化作业,还能提高生产线的生产效率和准确…...

吴恩达《微调大型语言模型》笔记
微调(fine-tuning)就是利用特有数据和技巧将通用模型转换为能执行具体任务的一种方式。例如,将 GPT-3 这种通用模型转换为诸如 ChatGPT 这样的专门用于聊天的模型。或者将 GPT-4 转换为诸如 GitHub Coplot 这样的专门用于写代码的模型。 这里…...

Java中的Servlet
Java中的Servlet 在Java中,Servlet是一种用于处理Web请求的服务器端组件。Servlet生命周期是Servlet在运行时所经历的一系列阶段,每个阶段都调用特定的方法。以下是Servlet生命周期内调用的方法过程: 初始化阶段(Initialization&…...

Flutter配置Android SDK路径
在使用VSCode作为开发Flutter的工具时,当选择调试设备时,通常看不到android的模拟器,只能看到Chrome之类的。 原因就是Flutter找不到Android的SDK路径,所以无法识别模拟器,我们用flutter doctor命令检查环境时…...

jwt的基本介绍
说出我的悲惨故事给大家乐呵乐呵:公司刚来了一个实习生,老板让他写几个接口给我,我页面还没画完呢。他就把接口给我了,我敲开心,第一次见这么高效率的后端。但我很快就笑不出来了。他似乎不知道HTTP通信是无状态的。他…...

常见Vue事件修饰符浅析
一、.stop修饰符 .stop修饰符代表event.stopPropagation(),加上这个修饰符,就等于在方法中加上了这句代码。 <!--阻止单击事件继续传播--> <a click.stop"doThis"></a>上面的代码等同于如下代码。 <!--阻止单击事件继…...

怎样开始用selenium进行自动化测试?
如果您刚开始使用 Selenium 进行自动化测试,以下是建议的步骤。 1、安装 Selenium 首先,您需要安装 Selenium。Selenium 支持多种编程语言,如 Python、Java、C# 等。可以通过 pip 命令在 Python 中安装 Selenium: pip install …...

二维数组多次排序 或 嵌套list多次排序
可以排序int[ ][ ]的顺序,也可以排序List<List<Integer>> 顺序 为便于理解,以力扣原题为例:1333.餐厅过滤器 原题中给了一个双重数组,并要求返回一个List<Integer>。 方法1: 会用流的,…...

Flutter - 波浪动画和lottie动画的使用
demo 地址: https://github.com/iotjin/jh_flutter_demo 代码不定时更新,请前往github查看最新代码 波浪动画三方库wave lottie动画 Lottie 是 Airbnb 开发的一款能够为原生应用添加动画效果的开源工具。具有丰富的动画效果和交互功能。 # 波浪动画 https://pub-web…...

忘记压缩包密码?解决方法一键找回,省时又便捷!
使用在线rar/zip解密工具,找回rar/zip密码并解密压缩包的方法非常简单。具体步骤如下:首先,在百度上搜索“密码帝官网”,这是一个专业的解密服务网站。然后,点击搜索结果中的链接,进入官网首页。在页面上方…...

“UTONMOS”掀起元宇宙游戏热潮,全球发展前景广阔
我们都知道,市面上无论是PC端的网游还是移动端手游,它如果要做到源源不断的内容输出,不仅取决于游戏公司产品质量和业绩,也与公司的决策和市场沟通密不可分。 元宇宙游戏市场受到关注 近年来,元宇宙游戏市场逐渐升温…...

用idea工具scala 和 Java开发 spark案例:WordCount
目录 一 环境准备 二 scala代码编写 三 java 代码编写 一 环境准备 创建一个 maven 工程 添加下列依赖 <dependency><groupId>org.apache.spark</groupId><artifactId>spark-core_2.12</artifactId><version>${spark.version}</vers…...

【git merge/rebase】详解合并代码、解决冲突
目录 1.概述 2.merge 3.rebase 4.merge和rabase的区别 5.解决冲突 1.概述 在实际开发中,一个项目往往是多个人一起协作的,头天下班前大家把代码交到远端仓库,第二天工作的第一件事情都是从服务器上拉最新的代码,保证代码版本…...

nrm,npm源的管理工具
npm手动切换淘宝源 查看当前的仓库 npm config get registry设置成淘宝源 npm config set registry https://registry.npmmirror.com/设置回官方源 npm config set registry https://registry.npmjs.org/手动切换不免不太方便,而且网上很多资料淘宝源还是过期的链接…...

HarmonyOS/OpenHarmony原生应用-ArkTS万能卡片组件Stack
堆叠容器,子组件按照顺序依次入栈,后一个子组件覆盖前一个子组件。该组件从API Version 7开始支持。可以包含子组件。 一、接口 Stack(value?: { alignContent?: Alignment }) 从API version 9开始,该接口支持在ArkTS卡片中使用。 二、…...

腾讯云2核4G服务器一年和三年价格性能测评
腾讯云轻量2核4G5M服务器:CPU内存流量带宽系统盘性能测评:轻量应用服务器2核4G5M带宽,免费500GB月流量,60GB系统盘SSD盘,5M带宽下载速度可达640KB/秒,流量超额按照0.8元每GB的价格支付流量费,轻…...

集线器、交换机、路由器是如何转发包的
集线器、交换机、路由器是如何转发包的 集线器交换机MAC地址表的维护 路由器路由表中的信息路由器的包接收操作查询路由表确定输出端口找不到匹配路由时选择默认路由包的有效期通过分片功能拆分大网络包路由器发送操作中的一些特点 参考文档 集线器 集线器是一层(物…...

交通物流模型 | MDRGCN:用于多模式交通客流预测的深度学习模型
城市交通拥堵是造成交通事故的重要原因,也是城市发展的主要障碍。通过学习历史交通流数据,我们可以预测未来一些区域的交通流,这对城市道路规划、交通管理、交通控制等都有重要意义。然而,由于交通网络拓扑结构的复杂性和影响交通流的因素的多样性,交通模式往往是复杂多变…...

保研经历分享(一)
这个系列的文章主要是想记录一下自己大学期间最重要的一件事(保研!!)的经历、过程,外加一些保研流程介绍、面试经验、院校投递、踩坑经历,主要给学弟学妹们避雷,也做一些借鉴吧~ 这一篇主要是对保研过程的一些介绍&…...

【手写数字识别】数据挖掘实验二
文章目录 Ⅰ、项目任务要求任务描述:主要任务要求(必须完成以下内容但不限于这些内容): II、实现过程数据集描述实验运行环境描述KNN模型决策树模型朴素贝叶斯模型SVM模型不同方法对MNIST数据集分类识别结果分析(不同方法识别对比率表及结果分析) 完整代…...

什么是云计算?云计算简介
其实“云计算”作为一个名词而言,那是相当成功滴。很多人都有听过。但提及云计算”具体是什么?很多人,知其然,却不知其所以然! 利用软件将这些成千上万不可靠的硬件组织成一个稳定可靠的IT系统,以此支撑其公司的IT基础服务。这家…...

Vue路由进阶--VueRouter声明式导航
Vue路由进阶–VueRouter声明式导航 文章目录 Vue路由进阶--VueRouter声明式导航1、声明式导航1.1、导航链接1.2、高亮类名1.3、跳转传参1.4、动态路由参数可选符 1、声明式导航 1.1、导航链接 需求:实现导航高亮效果 vue-router提供了一个全局组件router-link(取…...

Oracle 云服务即将支持 PostgreSQL!
2023 年 9 月 19 日,Oracle 产品团队发布了一篇文章,宣布 Oracle 云基础架构(OCI)开始提供 PostgreSQL 服务。目前支持的版本为 PostgreSQL 14.9,提供有限支持,12 月份将会提供正式版本。 众所周知&#x…...