Linux网络编程——详解SOCKET( 二 )
就是通过IP+端口号进行匹配 , 匹配之后可以通过socket进行数据的发送和接收(socket本质是文件描述符fd)
文章插图
具体的流程如下
文章插图
socket创建#include#include int socket(int domain, int type, int protocol);
- domain:AF_INET 这是大多数用来产生socket的协议 , 使用TCP或UDP来传输 , 用IPv4的地址AF_INET6 与上面类似 , 不过是采用IPv6的地址AF_UNIX 本地协议 , 使用在Unix和Linux系统上 , 一般都是当客户端和服务器在同一台及其上的时候使用
- type:(1)SOCK_STREAM 这个协议是按照顺序的、可靠的、数据完整的基于字节流的连接 。 这是一个使用最多的socket类型 , 这个socket是使用TCP来进行传输 。 (2)SOCK_DGRAM 这个协议是无连接的、固定长度的传输调用 。 该协议是不可靠的 , 使用UDP来进行它的连接 。 (3)SOCK_SEQPACKET 这个协议是双线路的、可靠的连接 , 发送固定长度的数据包进行传输 。 必须把这个包完整的接受才能进行读取 。 (4)SOCK_RAW 这个socket类型提供单一的网络访问 , 这个socket类型使用ICMP公共协议 。 (ping、traceroute使用该协议)(5)SOCK_RDM 这个类型是很少使用的 , 在大部分的操作系统上没有实现 , 它是提供给数据链路层使用 , 不保证数据包的顺序
- protocol:0 默认协议
- 返回值:成功返回一个新的文件描述符(也叫监听套接字) , 失败返回-1
- 在创建了套接字之后需要IP和端口号和套接字绑定在一起( IP地址:在网络环境中 , 唯一标识一台主机 , 端口号:在主机中唯一标识一个进程)
- 前面讲过 , struct sockaddr *是一个通用指针类型 , addr参数实际上可以接受多种协议的sockaddr结构体 , 而它们的长度各不相同 , 所以需要第三个参数addrlen指定结构体的长度
#include #include int bind(int sockfd, const struct sockaddr *addr, socklen_t addrlen);
- sockfd:socket文件描述符
- addr:构造出IP地址加端口号
- addrlen:sizeof(addr)长度
- 返回值:成功返回0 , 失败返回-1, 设置errno
struct sockaddr_in servaddr;bzero(//清0结构体servaddr.sin_family = AF_INET;servaddr.sin_addr.s_addr = htonl(INADDR_ANY);servaddr.sin_port = htons(8000);
listen- 创建了套接字之后通常需要等待客户端的连接,此时可以使用listen函数将该套接字转换为倾听套接字 。
- 可以指定同时连接的最大客户端数量
- 若达到数量上限 , 新客户端等待其它已链接的客户端链接结束
#include #include int listen(int sockfd, int backlog);
- sockfd:socket文件描述符
- backlog:排队建立3次握手队列和刚刚建立3次握手队列的连接数和
- 返回值:成功返回0 , 失败返回-1
- 当服务器倾听到一个连接之后 , 可以使用函数accept从倾听套接字的完成连接队列中接收一个连接 , 如果这个完成连接队列为空 , 则会使得这个进程进入睡眠状态
#include/* See NOTES */#include int accept(int sockfd, struct sockaddr *addr, socklen_t *addrlen);
- sockdf:socket文件描述符
- addr:传出参数 , 返回链接客户端地址信息 , 含IP地址和端口号
- addrlen:传入传出参数,传入sizeof(addr)大小 , 函数返回时返回真正接收到地址结构体的大小
- 返回值:成功返回一个新的socket文件描述符 , 用于和客户端通信 , 失败返回-1 , 设置errno
- 客户端需要调用connect()连接服务器 , connect和bind的参数形式一致 , 区别在于bind的参数是自己的地址 , 而connect的参数是对方的地址
#include#include int connect(int sockfd, const struct sockaddr *addr, socklen_t addrlen);
- sockdf:socket文件描述符
- addr:传入参数 , 指定服务器端地址信息 , 含IP地址和端口号
- addrlen:传入参数,传入sizeof(addr)大小
- 返回值:成功返回0 , 失败返回-1 , 设置errno
int read(int fd, char *buf, int len);int write(int fd, char *buf, int len);
- fd套接字描述符;
- buf指定数据缓冲区;
- len指定接收或发送的数据量大小(以字节为单位) 。
- 返回值返回读/写成功的数据量大小 , 失败则返回-1 。
int close(int fd);
- fd套接字描述符;
- 世代|Z星球——腾讯布局Z世代教育社交的新尝试
- 脉搏|把握时代发展脉搏,尽展巴蜀版权风采——2020年成都数字版权交易博览会成功举办
- 潜力|【国金研究】新星初现,商业化落地正当时 ——自动驾驶先行者Waymo潜力几何
- 移植|开发者将移植ARM Mac的Linux系统 但需要得到资金支持
- 沉浸|这里是朝阳——长楹天街“沉浸式”让消费体验再升级
- 简评|手握一个亿—Redmi Note9 Pro开箱简评
- 公司|走好科技成果转化“先手棋”——中煤集团石煤机公司依托技术创新推动高质量发展
- Linux|知名开发者要把Linux移植到苹果M1 Mac上
- 分类|聊聊电商产品设计有哪些共性——商品模块
- 明细|微言普法——取证小技巧调取微信转账明细记录