大家好,又见面了,我是你们的朋友全栈君。
点对点通信
Client / Server
通信模型
服务端
1. 创建通行节点-`socket`
2. 绑定-`bind`
3. 监听-`listen`
4. 接受连接-`accept`
5. 发送/接受数据- `write/read `或 `send/recv`
6. 断开连接,-`close`
接口设计
客户端
1. 创建通信节点-`socket`
2. 连接服务器-`connect`
3. 发送/接受数据- `write/read `或 `send/recv`
4. 断开连接,-`close`
接口设计
API-linux
socket
#include <sys/types.h> /* See NOTES */
#include <sys/socket.h>
int socket(int domain, int type, int protocol);
功能:
- 创建一个通行端点
入口:
domain
-协议域
AF_UNIX AF_LOCAL Synonym for AF_UNIX //本地通信协议
AF_INET IPv4 Internet protocols
AF_INET6 IPv6 Internet protocols
type
-套接字类型
SOCK_STREAM Provides sequenced, reliable, two-way, connection-based
byte streams. An out-of-band data transmission mecha‐
nism may be supported.
// 基于连接的有序可靠双向的字节流通信方式
SOCK_DGRAM Supports datagrams (connectionless, unreliable messages
of a fixed maximum length).
// 无连接不可靠的有固定长度的数据报通信方式
protocol
-通信协议- 默认值-0
返回值:
- 成功-返回一个套接字描述符号
- 失败- -1 设置errno
bind
#include <sys/types.h> /* See NOTES */
#include <sys/socket.h>
int bind(int sockfd, const struct sockaddr *addr,
socklen_t addrlen);
函数功能:
- 将套接字绑定到监听端口
入口:
- sockfd-服务套接字描述符
- addr-服务套接字内存地址
- addrlen-服务套接字内存长度
出口:
- 0-正常
listen
#include <sys/types.h> /* See NOTES */
#include <sys/socket.h>
int listen(int sockfd, int backlog);
功能:
- 监听服务套接字
参数:
- sockfd-服务套接字描述符
- backlog-同时连接的最大个数
返回:
- 0-正常
accept
#include <sys/types.h> /* See NOTES */
#include <sys/socket.h>
int accept(int sockfd, struct sockaddr *addr, socklen_t *addrlen);
功能:
- 接受连接-(如:tcp三次握手)
参数:
- sockfd-服务套接字描述符
- addr-连接套接字的内存地址
- addrlen-地址内存长度
返回:
- 连接套接字的描述符 -1-错误
connect
#include <sys/types.h> /* See NOTES */
#include <sys/socket.h>
int connect(int sockfd, const struct sockaddr *addr,
socklen_t addrlen);
功能:
- 发起连接
参数:
- socked-客户套接字描述符
- addr-服务套接字的内存地址
- addrlen-地址内存长度
返回:
- 0-正常
注意
管道破裂
场景:
- 通信双方在通信过程中,一方直接退出,另一方仍然向已退出一方,继续输送数据。
后果:
- 未退出一方的操作系统,向该进程发送一个
SIGPIPE
信号 - 该信号量默认关闭程序
解决方法:
- 捕获该信号
- 更改代码 – 管道的一端关闭时,不再向管道内写数据
TCP断开等待
场景:
- 通信双方在通信过程中,一方主动断开后,立即重用
后果:
- 显示
address already in use
解决:
- 等待1-分钟
- 设置套接选项,允许立即重新适用地址与端口
无FIN-下线
场景:
- 在连接双方通信过程中,无FIN结束报文,直接断开连接
后果:
read
-所读取实际长度<预设长度
用途:
- 可将实际长度与预设长度对比-判断对方是否在线
发布者:全栈程序员-用户IM,转载请注明出处:https://javaforall.cn/154651.html原文链接:https://javaforall.cn
【正版授权,激活自己账号】: Jetbrains全家桶Ide使用,1年售后保障,每天仅需1毛
【官方授权 正版激活】: 官方授权 正版激活 支持Jetbrains家族下所有IDE 使用个人JB账号...