网络编程套接字


linux操作系统


IP地址

IP地址是⼀个4字节, 32位的整数,通常也使⽤ “点分⼗进制” 的字符串表⽰IP地址


端口号

端口号是一个2个字节16位的整数,用来标识一个进程。


IP地址+端口号能够标识网络上的某一台主机的某一进程;
一个进程可以绑定多个端口号,但一个端口号不能被多个进程绑定。


网络字节序


内存中的多字节数据相对于内存地址有⼤端和⼩端之分, 磁盘⽂件中的多字节数据相对于⽂件中的偏移地址也有⼤端⼩端之分, 网络数据流同样有⼤端⼩端之分


网络数据流的地址规定:先发出的数据是低地址,后发出的数据是⾼地址.
TCP/IP协议规定,网络数据流应采⽤⼤端字节序,即低地址⾼字节
如果当前发送主机是⼩端, 就需要先将数据转成⼤端; 否则就忽略, 直接发送即可
这里写图片描述


可以调⽤库函数实现网络字节序和主机字节序的转换


这里写图片描述

h表⽰host,n表⽰network,to表示转换,l表⽰32位⻓整数,s表⽰16位短整数


socket API


头文件: #include < sys/socket.h >


// 创建 socket ⽂件描述符 (TCP/UDP, 客户端 + 服务器)
int socket(int domain, int type, int protocol);

第一个参数 指定协议类型 AF_INET:IPV4
第二个参数表示创建的socket要使用什么样的方式传输数据

SCOK_DGRAM 面向数据报 UDP协议
SOCK_STREAM 面向字节流 TCP协议

第三个参数 一般填0


// 绑定端⼝号 (TCP/UDP, 服务器)
int bind(int socket, const struct sockaddr *address,socklen_t address_len);

第一个参数 名字
第二个参数 结构体(sockaddr_in)地址(见下图)
第三个参数 结构体(sockaddr_in)长度


// 开始监听socket (TCP, 服务器)
int listen(int socket, int backlog);

第一个参数 文件描述符
第二个参数 内核所允许文件描述符等待的个数 (依情况而定可配置5 - 1023)


// 接收请求 (TCP, 服务器)
int accept(int socket,struct sockaddr* address,socklen_t* address_len);

第一个参数 文件描述符
第二个参数 对端客户端信息 结构体 输入输出型参数
第三个参数 结构体长度 输入输出型参数


// 建⽴连接 (TCP, 客户端)
int connect(int sockfd, const struct sockaddr *addr,socklen_t addrlen);


//发送数据 (TCP,客户端 + 服务器)
//如果 flags 值设置为0 则等价于 write
ssize_t send (int sockfd,const void *buf,size_t len,int flags);

第一个参数 文件描述符
第二个参数 缓冲区大小
第三个参数 缓冲区长度


//发送数据(TCP/UDP),客户端 + 服务器)
//如果dest_addr赋值为 NULL,addrlen 赋值为 0 ,则等价于send
ssize_t sendto(int sockfd,const void* buf,size_t len,int flags,const struct sockaddr *dest_addr,socklen_t sddrlen);

第一个参数 文件描述符
第二个参数 缓冲区大小
第三个参数 缓冲区长度
第四个参数 flag 默认0
第五个参数 对端的IP地址和端口号 存放地方
第六个参数 缓冲区的最大长度 (保存对端IP地址和端口号)


//接收数据(TCP,客户端+服务器)
//如果flags值设置为0,则等价于read
ssize_t recv(int sockfd,void* buf,size_t len,int flags);


//接收数据 (TCP/UDP,客户端+服务器)
//如果src_addr赋值为NULL,addrlen赋值为0,则等价于recv
ssize_t recvfrom(int sockfd,void* buf,size_t len,int flags,struct sockaddr *src_addr,socklen_t *addrlen);

第一个参数 文件描述符
第二个参数 缓冲区大小
第三个参数 缓冲区长度
第四个参数 flag 默认0
第五个参数 对端的IP地址和端口号 存放地方
第六个参数 缓冲区的最大长度 (保存对端IP地址和端口号)


sockaddr_in 结构体(IPV4)


地址格式定义头文件 #include < netinet/in.h >

这里写图片描述


地址转换函数
将一个点分十进制的字符串IP地址转换为一个数字IP,转换完成后刚好是网络字节序。


头文件 #include < arpa/inet.h >
inet_addr(const char *strptr);


OSI七层模型:
https://blog.csdn.net/Romantic_C/article/details/81665591
网络套接字:
http://www.noobyard.com/article/p-afkejdbv-pg.html
UDP服务器:
https://blog.csdn.net/Romantic_C/article/details/81705468
TCP服务器:
https://blog.csdn.net/Romantic_C/article/details/81707907
应用层:
http://www.noobyard.com/article/p-yqikerbl-rr.html
传输层:
https://blog.csdn.net/Romantic_C/article/details/81747317
网络层:
http://www.noobyard.com/article/p-flnqpmhh-qe.html
数据链路层:
http://www.noobyard.com/article/p-vsbedtvz-sw.html