2022.7.31 Linux——网络编程基础

1. 主机字节序列和网络字节序列

主机字节序列分为大端字节序和小端字节序,不同的主机采用的字节序列可能不同。
大端字节序是指一个整数的高位字节存储在内存的低地址处,低位字节存储在内存的高地址处。
小端字节序是指整数的高位字节存储在内存的高地址处,而低位字节存储在内存的低地址处。
在两台使用不同字节序的主机之间传递数据时,可能会出现冲突。所以,在将数据发送到网络时规定整型数据使用大端字节序,所以也把大端字节序称为网络字节序,对方接收到数据后,可以根据自己的字节序进行转换。
Linux系统提供如下 4 个函数来完成主机字节序和网络字节序之间的转换:
头文件:#include
2022.7.31 Linux——网络编程基础_第1张图片

2. 套接字地址结构

2.1 通用 socket 地址结构

socket 网络编程接口中表示 socket 地址的是结构体sockaddr,其定义如下:

#include
struct sockaddr
{
    sa_family_t sa_family;
    char sa_data[14];
};

sa_family成员是地址族类型(sa_family_t)的变量,地址族类型通常与协议族类型对应,常见的协议族和对应的地址族如下:
2022.7.31 Linux——网络编程基础_第2张图片

2.2 专用 socket 地址结构

TCP/IP协议族有sockaddr_in和sockaddr_in6两个专用socket地址结构体,它们分为IPV4和IPV6;
其中:
sin_family:地址族 AF_INET
sin_port:端口号,需要用网络字节序表示
sin_addr:IPV4地址结构,s_addr以网络字节序表示IPV4地址

2.3 IP 地址转换函数

人们习惯用点分十进制字符串表示IPV4地址,但是编程中我们需要先把它们转化为整数方能使用,下面函数可用于点分十进制字符串表示的IPV4地址和网络字节序整数表示的IPV4地址之间的转换:

#include 
in_addr_t inet_addr(const char *cp); //字符串表示的 IPV4 地址转化为网络字节序
char* inet_ntoa(struct in_addr in); // IPV4 地址的网络字节序转化为字符串表示

3. 网络编程接口

需要头文件有:#include ,#include
在进行网络编程之前,所用到的一些函数:
(1)int socket( int domain, int type, int protocol)
socket() —创建套接字,成功返回套接字的文件描述符,失败返回-1;
domain:设置套接字的协议族,AF_UNIX AF_INET AF_INET6
type:设置套接字的服务类型 SOCK_STREAM SOCK_DGRAM
protocol: 一般设置为 0,表示使用默认协议
*(2)int bind( int sockfd, const struct sockaddr addr, socklen_t addrlen)
bind()—将 sockfd 与一个 socket 地址绑定,成功返回 0,失败返回-1
sockfd:网络套接字描述符
addr:地址结构
addrlen: socket 地址的长度
(3)int listen( int sockfd, int backlog)
listen()—创建一个监听队列以存储待处理的客户连接,成功返回 0,失败返回-1
sockfd :被监听的 socket 套接字
backlog :表示处于完全连接状态的 socket 的上限
**(4)int accept( int sockfd, struct sockaddr addr, socklen_t addrlen)
accept()—从 listen 监听队列中接收一个连接,成功返回一个新的连接 socket,该 socket 唯一地标识了被接收的这个连接,失败返回-1
sockfd :执行过 listen 系统调用的监听 socket
addr :用来获取被接受连接的远端 socket 地址
addrlen :指定该 socket 地址的长度
*(5)int connect( int sockfd, const struct sockaddr serv_addr, socklen_t addrlen)
connect()—客户端需要通过此系统调用来主动与服务器建立连接,成功返回 0,失败返回-1
sockfd:是由 socket()返回的一个 socket。
serv_addr :服务器监听的 socket 地址
addrlen :指定这个地址的长度
(6)int close( int sockfd)
close()—关闭一个连接,实际上就是关闭该连接对应的 socket
*(7)ssize_t recv( int sockfd, void buff, size_t len, int flags)
TCP 数据读写:
recv()—读取 sockfd 上的数据,buff 和 len 参数分别指定读缓冲区的位置和大小
flags:为数据收发提供了额外的控制
*(8)ssize_t send(int sockfd, const void buff, size_t len, int flags)
send()往 socket 上写入数据,buff 和 len 参数分别指定写缓冲区的位置和数据长

flags:为数据收发提供了额外的控制
*(9)ssize_t recvfrom(int sockfd, void buff, size_t len, int flags, struct sockaddr src_addr, socklen_t addrlen)
UDP 数据读写:
recvfrom()—读取 sockfd 上的数据,buff 和 len 参数分别指定读缓冲区的位置和大

src_addr :记录发送端的 socket 地址
addrlen:指定该地址的长度
(10)ssize_t sendto(int sockfd, void buff, size_t len, int flags, struct sockaddr dest_addr, socklen_t addrlen)
sendto()—往 socket 上写入数据,buff 和 len 参数分别指定写缓冲区的位置和数据长

dest_addr :指定接收数据端的 socket 地址
addrlen :指定该地址的长度

你可能感兴趣的:(linux基础,Linux,linux)