套接字编程
Posted 李憨憨_
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了套接字编程相关的知识,希望对你有一定的参考价值。
套接字编程
socket套接字编程: 网络通信程序的编写(接口 + 流程)
udp协议通信程序的编写/tcp协议通信程序的编写
udp协议与tcp协议的区别初识:
udp协议: 用户数据报协议
特性: 无连接, 不可靠, 面向数据报
应用场景: 实时性要求大于安全性要求的场景—视频传输
tcp协议: 传输控制协议
特性: 面向连接, 可靠传输, 面向字节流;
应用场景: 安全性要求大于实时性要求的场景—文件传输
在网络通信程序中, 通信两端分为: 客户端, 服务端
客户端: 通常是提供给客户的通信端, 通常是编写通信程序中主动发起请求的一端;
服务端: 通常指被动接受服务, 提供服务的通信端
客户端是主动发送请求的一端, 也就意味着客户端必须提前能够知道服务端的地址信息(ip+port)是多少
服务端的地址信息通常是固定的, 并且是提前提供给客户端的
udp通信程序的编写
通信流程
接口认识:
1.创建套接字:
int socket(int domain, int type, int protocol);
domain: 地址域类型----AF_INET–IPv4通信, 使用IPv4的地址结构
type: 套接字类型 SOCK_STREAM(流式套接字) / SOCK_DGRAM(数据报套接字)
udp通信必须使用SOCK_DGRAM; tcp必须使用SOCK_STREAM
protocol: 本次通信使用的协议; IPPROTO_TCP- 6 / IPPROTO_UDP -17
返回值: 返回一个文件描述符–操作句柄; 失败返回-1;
2.为套接字绑定地址信息
int bind(int sockfd, struct sockaddr *my_addr, socklen_t addrlen);
sockfd: 创建套接字返回的操作句柄
addr: 当前绑定的地址信息
addrlen: 地址信息长度
返回值: 成功返回0; 失败返回-1;
3.接收数据
ssize_t recvfrom(int sockfd, void *buf, size_t len, int flags, struct sockaddr *src_addr, socklen_t *addrlen);
sockfd: 操作句柄; buf: 空间地址, 用于存放接收的数据
len: 要接收的数据长度; flag: 选项标志–默认0–表示阻塞接收
src_addr: 本条数据的源端地址信息
addrlen: 输入输出参数–指定要接收多长的地址结构, 并且返回实际接收的地址长度
返回值: 返回实际接收到的数据长度; 失败返回-1;
4.发送数据
ssize_t sendto(int sockfd, const void *buf, size_t len, int flags,const struct sockaddr *dest_addr, socklen_t addrlen);
sockfd: 操作句柄; data: 要发送的数据的空间首地址;
len: 要发送的数据长度; flag: 默认0–阻塞发送;
peeraddr: 对端地址信息; addrlen: 地址结构长度;
返回值: 成功返回实际发送的数据长度, 失败返回-1;
5.关闭套接字
int close(int fd);
字节序转换接口:
uint32_t htonl(uint32_t hostlong);32位数据主机到网络字节序的转换
uint16_t htons(uint16_t hostshort);16位数据主机到网络字节序的转换
uint32_t ntohl(uint32_t netlong);32位数据网络到主机字节序的转换
uint16_t ntohs(uint16_t netshort);16位数据网络到主机字节序的转换
port端口转换使用s, IP转换用 l , 不能混用
将字符串点分十进制IP地址转换为整型网络字节序IP地址
in_addr_t inet_addr(const char *cp);
“192.168.2.2” -> 0xc0a80202
将网络字节序IP地址转换为字符串点分十进制IP地址
char *inet_ntoa(struct in_addr in);
这两个接口只能进行ipv4的地址转换, 不能进行ipv6的地址转换
以上是关于套接字编程的主要内容,如果未能解决你的问题,请参考以下文章