3 套接字编程简介

本文介绍了IPv4和IPv6套接字地址结构及其编程应用,包括不同字节序的转换方法,通用套接字地址结构的使用,以及IPv4地址转换函数的详细解析。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

2012年刚刚把tcp/ip详解看完,受益匪浅,新年伊始,开始研究UNP,由于前两章和tcp/ip详解的内容差不多,就没在此总结,直接从第3章开始研究,欢迎有类似爱好的朋友留言一起交流学习,ok,let's go。。。。奋斗


第3章 套接字编程简介

3.1 IPV4套接字地址结构

先来看下ipv4套接字地址结构,其定义在<netinet/in.h>



首先,这里最常用的3个字段sin_family,sin_addr,sin_port,其数据类型为uint8_t uint32_t uint16_t,其中sin_port被定义为网络字节序,标准定义方法如下:
struct sockaddr_in	servaddr;
bzero(&servaddr, sizeof(servaddr));
servaddr.sin_family = AF_INET;
servaddr.sin_port   = htons(1234);
servaddr.sin_addr.s_addr = inet_addr(172.16.1.212);

3.2 通用套接字地址结构


其定义在<sys/socket.h>中,套接字函数对于套接字参数的传递,都采用这个,如bind函数定义如下,当然传递时,数据类型是要强转的。
int bind(int sockfd,struct sockaddr * my_addr,int addrlen);
bind(sockfd, (struct sockaddr*)&my_addr, sizeof(struct sockaddr));

3.3 IPV6套接字地址结构

ipv6套接字地址结构定义在<netinet/in.h>中,定义如下

3.4 不同套接字地址结构比较



3.4 字节排序函数

其字节顺序及判断方法如下所示:

#include <stdio.h>

void main()
{
	unsigned short num = 0xAABB;
	char * p = (char *)(&num);

	if (0xAA == *p)
	{
		printf("big\n");
	}
	else if(0xBB == *p)
	{
		printf("short\n");
	}
	else
	{
		;
	}
}

其中h标识host,n标识network,s标识short,l标识long,当需要转换16位或者32位字节数时,需要调用上述4个函数,如果本身主机是大端序,又调用转换为大端序的函数,其函数不起作用。

3.5 地址转换函数

#include <arpa/inet.h>

// 地址字符串IPV4地址172.16.1.212与struct in_addr相互转换

// str->in_addr,若字符串有效则返回1,否则为0
int inet_aton(const char *strptr, struct in_addr *addrptr);

// str->in_addr,如果地址无效则返回INADDR_NONE
in_addr_t inet_addr(const char *strptr);

// in_addr->str
char *inet_ntoa(struct in_addr inaddr);

对于inet_addr函数,其无效返回值INADDR_NONE为32位最大值,而255.255.255.255其值正好为INADDR_NONE,所以函数对255.255.255.255无法处理。所以,我们不推荐采用inet_addr函数,最好采用inet_aton,其返回值是可靠的。
在来看下面俩函数,其对于IPV4和IPV6都是可用的,前面介绍那3个仅对IPV4有效。

family:AF_INET或者AF_INET6,否则返回错误。其addrptr类型对于IPV4为in_addr,对于IPV6为in6_addr

总结:上面一共介绍了5个函数一套是专门给IPV4用的,一套是IPV4和IPV6公用的,在这里,推荐给大家使用下面两个函数,原因是其有返回值来判断转换成功与否,行为更为安全。



评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值