参考
一、Socket技术详解 - 简书 (jianshu.com)
sockaddr和sockaddr_in详解_爱橙子的OK绷的博客-CSDN博客_sockaddr_in
过程
API
1. 创建套接字
int socket(int af, int type, int protocol);
af: 地址族,即IP地址类型
常用的有AF_INET(IPv4)和AF_INET6(IPv6)
type: 数据传输方式
常用的有SOCK_STREAM(面向连接、可靠)和 SOCK_DGRAM(无连接)
protocol: 传输协议
常用的有IPPROTO_TCP(TCP传输协议)和 IPPTOTO_UDP(UDP传输协议)
2. 指定本地地址
int bind(int sock, struct sockaddr* addr, socklen_t addrlen);
服务器端要用bind()函数将套接字与特定的IP地址和端口绑定起来,只有这样,流经该IP地址和端口的数据才能交给套接字处理
sockaddr 和 sockaddr_in
struct sockaddr_in { short sin_family; //地址族 u_short sin_port; //16位TCP/UDP端口号 struct in_addr sin_addr; //32位IP地址 char sin_zero[8]; //不使用 };
在网络编程中我们使用sockaddr_in来建立所需的信息,强制类型转换后传入用sockaddr做参数的函数
sock: socket文件描述符
addr: sockaddr结构体变量的指针
addrlen: addr变量的长度,可由sizeof()计算得出
3. 数据的发送
int sendto(int sock, void* buf, size_t nbytes, int flags, struct sockaddr* to, socklen_t addrlen);
sock: 用于传输UDP数据的套接字
buf: 保存待传输数据的缓冲区地址
nbytes: 待传输数据的长度
flags: 一般为0
to: 存有目标地址信息的 sockaddr 结构体变量的地址
addrlen: to变量的长度
4. 数据的接收
int recvfrom(int sock, void* buf, size_t nbytes, int flags, struct sockadr* from, socklen_t* addrlen);
sock: 用于接收UDP数据的套接字
buf: 保存接收数据的缓冲区地址
nbytes: 可接收的最大字节数(不能超过buf缓冲区的大小)
flags: 一般为0
from: 存有发送端地址信息的 sockaddr 结构体变量的地址
addrlen: 保存from的长度的变量地址值
5. 关闭
int close(fd);
fd: 要关闭的文件描述符