网络编程-Socket通信

Socket通信

1、什么是套接字

​ Socket是封装了TCP/IP协议簇的系统API接口,这使得程序员无需关注协议本身,直接使用socket提供的接口与不同主机间的进程互联通信。
​ 目前市面上主流的操作系统都采用这套机制进制网络通信,所以不同种类的操作系统,使用不同的编程语言,只要调用操作系统提供的Socket接口,都能进行网络通信。

2、基于TCP协议的Socket编程模型

被连接者需要完成的任务(服务端)

1、创建socket内核对象,内核创建完成后会返回它的描述符(该描述只是为了完成连接,三次握手)
2、准备本机地址(ip地址+端口号)
3、绑定(把本机地址与socket对象进行绑定)
4、开启监听,并设置排队的队列长度
5、等待连接,连接成功后,内核会再返回一个连接成功的Socket描述符,专门用来通信
for (;;) {
	6、接收请求
	7、返回结果
}
8、关闭通信的Socket对象
9、关闭连接的Socket对象

连接者需要完成的任务(客户端)

1、创建socket内核对象,内核创建完成后会返回它的描述符
2、准备被连接者的地址(ip地址+端口号)
3、发起连接,使用Socket+地址(ip地址+端口号)发起连接请求
for (;;) {
	4、发送请求
	5、接收结果
}
6、关闭Socket对象

3、TCP通信需要使用Socket接口

/**
 * 功能: 创建Socket对象
 * @domain:
 *    AF_UNIX, AF_LOCAL   采用本地socket文件进行通信,如果用它则只能本机上的两个进程进行通信
 *	  AF_INET             IPv4地址
 *	  AF_INET6   			IPv6地址
 * @type:
 *    SOCK_STREAM	数据流	TCP
 *    SOCK_DGRAM 报文 UDP
 * @protocol:
 *    特殊通信协议,写0即可
 * 返回值:
 *    成功则返回Socket对象描述符,失败返回-1。
*/
int socket(int domain, int type, int protocol);

// 基本地址类型,它是socket系列接口的表面参数,而实际使用的是sockaddr_un或sockaddr_in,我们需要把sockaddr_in强制转换成sockaddr类型。
struct sockaddr_in  {
    sa_family_t sin_family;		// 地址类型,与domain保持一致即可
    in_port_t sin_port;			// 端口号,网络字节序的2字节整数
    struct in_addr sin_addr.s_addr;	// IP地址,网络字节序的4字节整数
};

/**
 * 功能: 绑定Socket对象与通信地址
 * @sockfd: Socket对象描述符
 * @addr: 通信地址,实际提供可能是sockaddr_un或sockaddr_in,需要对它们进行强制转换
 * @addrlen: addr结构体的字节数
 * 返回值: 成功返回0,失败返回-1
*/
int bind(int sockfd, const struct sockaddr *addr,socklen_t addrlen);

/**
 * 功能: 开启Socket对象的监听
 * sockfd: Socket地址描述符
 * backlog: 备胎的数量
*/
int listen(int sockfd, int backlog);
    
/**
 * 功能: 等待连接,没有成功连接之前,会进入阻塞状态
 * @sockfd: Socket对象描述符
 * @addr: 用于存储连接者的通信地址
 * @addrlen: 既是输入(告诉accetp接口,addr结构体的字节数),也是输出(实际接收到的addr结构的字节数)
 * 返回值: 建立连接的,能够通信的Socket对象描述符,失败返回-1
*/
int accept(int sockfd, struct sockaddr *addr, socklen_t *addrlen);
    
/**
 * 功能: 让sockfd对象向addr地址发起连接
 * @sockfd: Socket对象描述符
 * @addr: 连接目标的地址
 * @addrlen: addr结构体的字节数
 * 返回值: 成功返回0,失败返回-1
*/
int connect(int sockfd, const struct sockaddr *addr,socklen_t addrlen);

/**
 * 功能: 从Socket对象读接收干字节
 * @sockfd: Socket对象描述符
 * @buf: 接收数据的内存块首地址
 * @len: buf的字节数
 * @flags: 是否阻塞,写0即可
 * 返回值: 成功接收到了多少个字节,失败返回-1
*/  
ssize_t recv(int sockfd, void *buf, size_t len, int flags);

/**
 * 功能: 通过Socket对象发送若干字节
 * @sockfd: Socket对象描述符
 * @buf: 要发送的内存块首地址
 * @len: 要发送的字节数
 * @flags: 是否阻塞,写0即可
 * 返回值: 成功发送了多少个字节,失败返回-1
*/
ssize_t send(int sockfd, const void *buf, size_t len, int flags);
    
/**
 * 功能: 关闭fd描述所代表的内核对象
*/
int close(int fd);

/**
 * 功能: 把本地字节序的 unsigned short 类型的数据转换网络字节序
*/
uint16_t htons(uint16_t hostshort);
    
/**
 * 功能: 把字符串格式 点分十进制的ip地址 转换成网络字节序的4字节ip地址
*/
in_addr_t inet_addr(const char *cp);

4、基于UDP协议的Socket编程模型

被接收者需要完成的任务(服务端)

1、创建socket内核对象,内核创建完成后会返回它的描述符
	type:SOCK_DGRAM
2、准备本机地址(ip地址+端口号)
3、绑定(把本机地址与socket对象进行绑定)
for (;;) {
	4、接收请求,同时接收发送者的地址
	5、返回结果,按发送者的地址进行返回
}
6、关闭Socket对象

发送者需要完成的任务

1、创建socket内核对象,内核创建完成后会返回它的描述符
	type:SOCK_DGRAM
2、准备接收者的地址(ip地址+端口号)
for (;;) {
	3、发送请求,根据接收者的地址发送数据
	4、接收结果,并接收返回者的地址
}
5、关闭Socket对象

5、UDP通信需要使用Socket接口

/**
 * 功能: UDP专用的数据发送函数。
 * @dest_addr: 收件人的地址。
 * @addrlen: 地址长度。
*/
ssize_t sendto(int sockfd, const void *buf, size_t len, int flags,
                      const struct sockaddr *dest_addr, socklen_t addrlen);

/**
 * 功能: UDP专用的数据接收函数。
 * @src_addr: 发件人的地址,也是数据返回时的地址
 * @addrlen: 地址长度,既是输入也是输出
*/           
ssize_t recvfrom(int sockfd, void *buf, size_t len, int flags,
                        struct sockaddr *src_addr, socklen_t *addrlen);

6、UDP的连接操作

​ UPD协议底层是否需要连接操作,客户端但可以在Socket层面进行连接,连接后的Socket对象在后续的通信过程中就不再需要通信地址了。

7、本地Socket通信

​ 网络Socket通信是把网卡抽象成Socket文件配合TCP/IP协议簇,能够使当前进程与其它计算机的进程进行网络通信。
​ 本地Socket通信是在文件系统中创建Socket文件,能够使当前进程与本机的其它进程进行通信(IPC进程间通信)。
​ 使用sockaddr_un类型的通信地址,当调用socket对象与通信地址绑定时,会自动创建socket文件。

posted @   sleeeeeping  阅读(15)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· winform 绘制太阳,地球,月球 运作规律
· 震惊!C++程序真的从main开始吗?99%的程序员都答错了
· AI与.NET技术实操系列(五):向量存储与相似性搜索在 .NET 中的实现
· 超详细:普通电脑也行Windows部署deepseek R1训练数据并当服务器共享给他人
· 【硬核科普】Trae如何「偷看」你的代码?零基础破解AI编程运行原理
  1. 1 吹梦到西洲 恋恋故人难,黄诗扶,妖扬
  2. 2 敢归云间宿 三无Marblue
吹梦到西洲 - 恋恋故人难,黄诗扶,妖扬
00:00 / 00:00
An audio error has occurred, player will skip forward in 2 seconds.

作词 : 颀鞍

作曲 : 铃木航海

编曲 : 远藤直弥/冯帆

制作人 : 冯帆/铃木航海

(妖扬)

(妖扬)

无何化有 感物知春秋

秋毫濡沫欲绸缪 搦管相留

(黄诗扶)

留骨攒峰 留容映水秀

留观四时曾邂逅 佳人西洲

(妖扬)

(妖扬)

西洲何有 远树平高丘

云闲方外雨不收 稚子牵牛

(黄诗扶)

闹市无声 百态阴晴栩栩侔

藤衣半卷苔衣皱 岁月自无忧

(妖扬)

(妖扬)

驾马驱车 尚几程扶摇入画中 咫尺

(黄诗扶)

径曲桥横 精诚难通

(黄诗扶、妖扬)

(黄诗扶、妖扬)

盼你渡口 待你桥头

松香接地走

挥癯龙绣虎出怀袖

起微石落海连波动

描数曲箜篌线同轴

勒笔烟直大漠 沧浪盘虬

一纸淋漓漫点方圆透

记我 长风万里绕指未相勾

形生意成 此意 逍遥不游

(妖扬)

(妖扬)

日月何寿 江海滴更漏

爱向人间借朝暮 悲喜为酬

(黄诗扶)

种柳春莺 知它风尘不可救

绵绵更在三生后 谁隔世读关鸠

(妖扬)

(妖扬)

诗说红豆 遍南国未见人长久 见多少

(黄诗扶)

来时芳华 去时白头

(黄诗扶、妖扬)

(黄诗扶、妖扬)

忘你不舍 寻你不休

画外人易朽

似浓淡相间色相构

染冰雪先披琉璃胄

蘸朱紫将登金银楼

天命碧城灰土 刀弓褐锈

举手夜古泼断青蓝右

照我 萤灯嫁昼只影归洪流

身魂如寄 此世 逍遥不游

(黄诗扶)

(黄诗扶)

情一物 无木成林无水行舟

情一事 未算藏谋真还谬

情一人 积深不厚积年不旧

情一念 墨尽非空 百代飞白骤 划地为囚

(妖扬)

(妖扬)

蓝田需汲酒 惟琼浆能浇美玉瘦

至高者清难垢 至贵者润因愁

痴竭火 知她不能求

醉逢歌 知他不必候

只约灵犀过隙灵光暗相投

(黄诗扶、妖扬)

(黄诗扶、妖扬)

万籁停吹奏

支颐听秋水问蜉蝣

既玄冥不可量北斗

却何信相思最温柔

顾盼花发鸿蒙 怦然而梦

你与二十八宿皆回眸

系我 彩翼鲸尾红丝天地周

情之所至 此心 逍遥不游

吉他 : ShadOw

钢琴 : ShadOw

和声编写 : 冯帆

和声 : 黄诗扶

人声混音 : 徐志明

混音 : 冯帆

母带 : 冯帆

企划 : 三糙文化

出品公司 : Negia Entertainment Inc.

点击右上角即可分享
微信分享提示