Linux(十七)网络基础:网络编程套接字

时间:2022-12-18 07:28:33

理解源IP地址和目的IP地址

在IP数据包头部中,有两个IP地址,分别叫做源IP地址,和目的IP地址

认识端口号

端口号是传输层协议的内容
端口号是一个2字节十六位的整数
端口号用来标识一个进程,告诉操作系统,当前的这个数据要交给哪一个进程来处理;
IP地址+端口号能被标识网络上的某一台主机的某一个进程
一个端口号只能被一个进程占用
一个进程可以绑定多个端口号,但是一个端口号不能被多个进程绑定

理解源端口号和目的端口号

传输层协议的数据段中有两个端口号,分别叫做原端口号和目的端口号,就是在描述数据是谁的,要发给谁

认识TCP协议

传输层协议
有链接
可靠传输
面向字节流
认识UDP协议
传输层协议
无连接
不可靠传输
面向数据报

套接字

在这里我们就可以知道网络端口号加上IP地址就构成了我们所说的套接字

网络字节序

我们已经知道,内存中的多字节数据相对于内存地址有大端和小端之分,磁盘文件中的多字节数据相对于文件中的偏移地址也有大端小端之分,网络数据流同样有大端小端之分,那么如何定义网络数据流的地址
*发送主机通常将发送缓冲区中的数据按内存地址从低到高的顺序发出;
*接收主机把从网络上街道的字节一次保存在接收缓冲区中,也是按照内存地址从低到高的顺序保存;
*因此,网络数据流地址应该是这样规定的:先发出的数据是低地址,后发出的数据是高地址;
*TCP/IP协议规定,网络数据流应采用大端字节序,即低地址高字节
*不管这台主机是大端机还是小端机,都会按照这个TCP/IP规定的网络字节序来发送/接收数据
*如果当前发送主机是小端,就需要先将数据转化成大端;否则就忽略,直接发送就可以了

为了使网络程序具有可移植性,使同样的C代码在大端和小段计算机上编译后都能正常运行,可以调用以下库函数做网络字节序和主机字节序的转换。

#include <arpa/inet.h> uint32_t htonl(uint32_t hostlong);
uint16_t htons(uint16_t hostshort);
uint32_t ntohl(uint32_t netlong);
uint16_t ntohs(uint16_t netshort);

*h表示Host,n表示Network,l表示32为长整数,s表示16位短整数
*例如htonl表示将32为的长整数从主机字节序转换为网络字节序,例如将IP地址转换后准备发送
*如果主机是小端字节序,这些函数将参数做相应的大小端转换后返回
*如果主机是大端字节序,这些函数不做转换,将参数直接返回

socket编程接口

//创建socket文件描述符(TCP/UDP,客户端+服务器)

int socket(int domain,int type,int protocol);

//绑定端口号(TCP/UDP,服务器)

int bind(int socket,const struct sockaddr *address,socklen_t address_len);

//开始监听socket(TCP,服务器)

int listen(int socket,int backlog);

//接收请求(TCP,服务器)

int accept(int socket,struct sockaddr *address,socklen_t *address_len);

//建立连接(TCP,客户端)

int connect(int sockfd,const struct sockaddr *addr,socklen_t addrlen);

sockaddr结构
Linux(十七)网络基础:网络编程套接字
Linux(十七)网络基础:网络编程套接字
Linux(十七)网络基础:网络编程套接字
虽然socket API的接口是sockaddr,但是我们真正在基于IPv4编程时,使用的结构是sockaddr_in;这个结构里主要有三部分信息:地址类型,端口号,IP地址