一、套接字类型
套接字类型分为:
①SOCK_STREAM(流式套接字)
②SOCK_DGRAM(数据报套接字)
③SOCK_RAW(原始套接字)
二、套接字地址结构
1.IPv4套接字地址结构
网际套接字地址结构,sockaddr_in,定义在头文件<netinet/in.h>中。
2.其结构体内部包含5个成员
①sin_len,存储套接字地址结构的长度
②sin_family,Internet地址族
③sin_port,端口号
④sin_addr,一个结构,该结构中的成员存储的才是IP地址
⑤sin_zero,成员暂时没有被使用,总是将其设置为0。我们总是考察②③④。
3.IPv6套接字地址结构
sockaddr_in6,定义在头文件<netinet/in.h>中
4.其结构体内部构成与sockaddr_in基本相同,但前缀为sin6_。
三、套接字基本函数
1.字节排序函数
主机字节序和网络字节序之间的相互转换,主要用到四个函数:
①uint16_t htons(uint16_t hosts);
②uint32_t htonl(uint32_t hostl);
③uint16_t ntohs(uint16_t nets);
④uint32_t ntohl(uint32_t nets);
2.字节操纵函数
(1)men打头
①memcpy:将一块内存的内容拷贝到另一块内存
void *memcpy(void *dest, const void *src, size_t n);
参数: dest
:目标内存地址。src
:源内存地址。n
:拷贝的字节数。
返回值:返回目标内存地址
②memset:将一块内存设置为指定的值
void *memset(void *dest, int val, size_t n);
参数: dest
:目标内存地址。val
:要设置的值。n
:设置的字节数。
返回值:返回目标内存地址
③memcmp:比较两块内存的内容
int memcmp(const void *s1, const void *s2, size_t n);
参数: s1
:第一块内存地址。s2
:第二块内存地址。n
:比较的字节数。
返回值:返回值为 0 表示两块内存内容相同。返回值小于 0 表示 s1
小于 s2
。返回值大于 0 表示 s1
大于 s2。
(2)b打头
①bzero:将一块内存设置为0
void bzero(void *s, size_t n);
参数:s:目标内存地址。n:设置为0的字节数。
返回值:无
②bcopy:将一块内存的内容拷贝到另一块内存
void bcopy(const void *src, void *dest, size_t n);
参数:src:源内存地址。dest:目标内存地址。n:拷贝的字节数。
返回值:无
③bcmp:比较两块内存的内容
int bcmp(const void *s1, const void *s2, size_t n);
参数:s1:第一块内存地址。s2:第二块内存地址。n:比较的字节数。
返回值:返回值为 0 表示两块内存内容相同。返回值不为 0 表示两块内存内容不同。
(3)区别
以men开头的函数是现代函数,它相较于以b开头的函数,在不同的编译器和平台上具有更好的一致性和性能,所以推荐使用以men开头的函数。
四、IP地址转换函数
在C语言网络编程中,IP地址转换函数用于在点分十进制字符串和二进制网络字节序之间进行转换。
1.只能处理IPv4协议
①inet_addr
:将点分十进制的IP地址字符串转换为网络字节序的32位整数。
in_addr_t inet_addr(const char *cp);
参数:cp
:点分十进制的IP地址字符串。
返回值:成功:返回网络字节序的32位整数。失败:返回 INADDR_NONE(通常为 -1)。
②inet_aton:将点分十进制的IP地址字符串转换为网络字节序的32位整数,并存储在 struct in_addr 结构体中。
int inet_aton(const char *cp, struct in_addr *inp);
参数:cp
:点分十进制的IP地址字符串。inp
:指向 struct in_addr
结构体的指针,用于存储转换后的IP地址。
返回值:成功:返回非零值。失败:返回0。
③inet_ntoa
将网络字节序的32位整数转换为点分十进制的IP地址字符串。
char *inet_ntoa(struct in_addr in);
参数:in
:网络字节序的32位整数,存储在 struct in_addr
结构体中。
返回值:成功:返回指向点分十进制IP地址字符串的指针。失败:返回NULL。
2.IPv4和IPv6均能处理
①inet_addr:
将点分十进制的IP地址字符串转换为网络字节序的32位整数。
in_addr_t inet_addr(const char *cp);
参数:cp
:点分十进制的IP地址字符串。
返回值:成功:返回网络字节序的32位整数。失败:返回 INADDR_NONE
(通常为 -1)。
②inet_aton:
将点分十进制的IP地址字符串转换为网络字节序的32位整数,并存储在 struct in_addr
结构体中。
int inet_aton(const char *cp, struct in_addr *inp);
参数:cp
:点分十进制的IP地址字符串。inp
:指向 struct in_addr
结构体的指针,用于存储转换后的IP地址。
返回值:成功:返回非零值。失败:返回0。
③inet_ntoa
:将网络字节序的32位整数转换为点分十进制的IP地址字符串。
char *inet_ntoa(struct in_addr in);
参数:in
:网络字节序的32位整数,存储在 struct in_addr
结构体中。
返回值:成功:返回指向点分十进制IP地址字符串的指针。失败:返回NULL。