网络编程(基于winsocket)-- 常用函数介绍(一)

本文主要记录网络编程中经常用到的函数,作为学习的笔记                                                                                                                                                                                                            

1、winsocket地址结构

一般的sockaddr地址结构:

typedef struct sockaddr {
	u_short sa_family;   //协议族  
	CHAR sa_data[14];    //IP地址和端口号                
} SOCKADDR, *PSOCKADDR, FAR *LPSOCKADDR;


除了以上的不常用的地址结构外,还有一个常用的地址结构:

typedef struct in_addr {
	union {
		struct { UCHAR s_b1, s_b2, s_b3, s_b4; } S_un_b;
		struct { USHORT s_w1, s_w2; } S_un_w;
		ULONG S_addr;
	} S_un;
} IN_ADDR, *PIN_ADDR, FAR *LPIN_ADDR;

typedef struct sockaddr_in {
	short   sin_family;     //协议族  
	u_short sin_port;      //端口号  
	IN_ADDR sin_addr;     //IP地址  
	CHAR sin_zero[8];    //填充数据  
} SOCKADDR_IN, *PSOCKADDR_IN;


以上两种地址结构用法相似,作为相同;相比于sockaddr,sockaddr_in的数据段更为详细,可以使用sockaddr_in来初始化然后强制转化为sockaddr,然后将其作为套接字函数的参数。sockaddr_in为了保证与sockaddr相同的长度,还增加了8字节的填充数据。


此外winsocket还提供了对ipv6的支持。

typedef struct in6_addr {
	union {
		UCHAR       Byte[16];
		USHORT      Word[8];
	} u;
} IN6_ADDR, *PIN6_ADDR, FAR *LPIN6_ADDR;

typedef struct sockaddr_in6 {
	ADDRESS_FAMILY sin6_family; // ipv6协议族  
	USHORT sin6_port;           // 端口号  
	ULONG  sin6_flowinfo;       // ipv6流信息  
	IN6_ADDR sin6_addr;         // ipv6地址  
	union {
		ULONG sin6_scope_id;
		SCOPE_ID sin6_scope_struct;
	};
} SOCKADDR_IN6_LH, *PSOCKADDR_IN6_LH, FAR *LPSOCKADDR_IN6_LH;


除了以上地址类型外,winsocket2还增加了addrinfo结构用于描述地址信息,该结构在getaddrinfo函数中使用,以链表的形式保存地址信息

addrinfo结构的结构如下:

typedef struct addrinfo
{
	int	ai_flags;       // getaddrinfo函数的调用选项  
	int     ai_family;      // 地址族  
	int     ai_socktype;    // 套接字类型  
	int     ai_protocol;    // 协议  
	size_t    ai_addrlen;     // ai_addr指向的sockaddr结构缓冲区字节长度  
	char *    ai_canonname;   // 主机的正规名称  
	_Field_size_bytes_(ai_addrlen) struct sockaddr *   ai_addr;        // 以sockaddr结构描述的地址信息  
	struct addrinfo *   ai_next;        // 指向下一个addrinfo结构  
}ADDRINFOA, *PADDRINFOA;

参数1(ai_flags):指定如何处理地址和名字,常见的参数值如下:

AI_PASSIVE                  0X00000001  // 套接字地址将用于监听绑定  
AI_CANONNAME                0x00000002  // 返回一个规范名  
AI_NUMERICHOST              0x00000004  // 以数字形式返回主机地址  
AI_NUMERICSERV              0x00000008  // 以端口号返回服务  
AI_ALL                      0x00000100  // 查找IPv4和IPv6地址  
AI_ADDRCONFIG               0x00000400  // 查询配置的地址类型(IPv4或是IPv6)  
AI_V4MAPPED                 0x00000800  // 如果没有找到IPv6地址,则返回映射到IPv6格式的IPv4地址  

参数2(ai_family):指定地址族,常见的地址族如下:

AF_INET          2            //IPv4:  
AF_INET6        23            //IPv6  
AF_UNSPEC        0            //协议无关  

参数3(ai_socktype):指明套接字的类型,套接字类型如下:

SOCK_STREAM     1               /* 流式套接字 (TCP)*/
SOCK_DGRAM      2               /* 数据包套接字(UDP)*/
SOCK_RAW        3               /* 原始套接字 */
SOCK_RDM        4               /* 可靠传输套接字*/
SOCK_SEQPACKET  5               /* 在UDP的基础上提供伪数据包 *

参数4(ai_protoco
  • 1
    点赞
  • 14
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值