Socket编程相关api
字节序分为大端字节序和小端字节序。大端字节序是指一个整数的高位字节存储在内存的低地址处,低位字节存储在内存的高地址处。小端字节序则相反。(大部分PC采用小端字节序,因此小端字节序又被称为主机字节序)
网络字节序:不同的机器可能使用不同的字节序,为了统一,在两台主机之间传递数据时,需要先将其转化为大端字节序,然后各自根据自身字节序进行转换存储。

1 IP 地址转换函数
//下面三个函数可用于用点分十进制字符串表示的IPv4地址和用网络字节序整数表示的IPv4地址之间的转换
#include<arpa/inet.h>
//inet_addr函数将用点分十进制字符串表示的IPv4地址转化为用网络字节序整数表示的IPv4地址。失败时返回INADDR_NONE
in_addr_t inet_addr(const char* strptr);
//inet_aton函数完成和inet_addr同样的功能,但是将转化结果存储于参数inp指向的地址结构中。他成功时返回,失败时返回0
int inet_aton(const char* cp,struct in_addr* inp);
//inet_ntoa函数将用网络字节序整数表示的IPv4地址转化为用点分十进制字符串表示的IPv4地址。但需要注意的是,该函数内部用一个静态变量存储转化结果,函数的返回值指向该静态内存,因此inet_ntoa是不可重入的。重入会改变之前转换的结果。
char* inet_ntoa(struct in_addr in);

//下面这对更新的函数也能完成和前面3个函数同样的功能,并且他们同时适用于IPv4地址和Ipv6地址
#include<arpa/inet.h>
//inet_pton函数将字符串表示的IP地址src转换成网络字节序整数表示的IP地址,并把转换结果存储于dst指向的内存中。af参数指定地址族(用于区别ipv4和ipv6),可以是AF_INET或者AF_INET6,inet_pton成功时返回1,失败时返回0并设置errno错误值。
int inet_pton(int af, const char* src,void* dst);
//inet_ntop函数进行相反的转换,前三个参数含义与inet_pton的参数相同,最后一个参数cnt指定目标存储单元的大小。它成功时返回目标存储单元的地址,失败时返回NULL并设置errno
const char* inet_ntop(int af,const void* src, char *dst,socklen_t cnt);
2 创建socket
在linux中socket被抽象成文件,用文件描述符去操作。
#include<sys/types.h>
#include<sys/socket.h>
//domain参数表示使用哪个底层协议族。对TCP/IP协议族而言,该参数应该设置为PF_INET(Protocol Family of Internet,用于IPv4)或PF_INET6(用于IPv6);对于UNIX本地域协议族而言,该参数应该设置为PF_UNIX。
//type指定服务类型。服务类型主要有SOCK_STREAM服务(流服务)和SOCK_UGRAM(数据报服务)。取SOCK_STREAM表示传输层使用TCP协议,取SOCK_DGRAM表示传输层使用UDP协议。
//值得指出的是, 自Linux内核版本2.6.17起, type参数可以接受上述服务类型与下面两个重要的标志相与的值: S

本文详细介绍了网络编程中的Socket API,包括IP地址转换、创建socket、命名socket、监听与连接、数据读写、关闭连接等关键操作。讲解了大端字节序、小端字节序和网络字节序的概念,以及TCP与UDP数据的读写方法。此外,还提到了带外数据的处理和获取socket地址信息的函数。

4422

被折叠的 条评论
为什么被折叠?



