基本数据结构
通用socket地址结构
struct sockaddr
{
u_short sa_family; //协议地址簇
char sa_data[14]; //通用地址
}
ipv4专用地址结构
struct sockaddr_in
{
short sin_family; // 协议地址簇
u_short sin_port; // 端口号,网络字节序
struct in_addr sin_addr; // ip地址,网络字节序
char sin_zero[8]; // 这8个字节纯粹是为了跟通用地址结构体对齐用的,没有实际用处
};
struct in_addr
{
union
{
struct { u_char s_b1,s_b2,s_b3,s_b4; } S_un_b;
struct { u_short s_w1,s_w2; } S_un_w;
u_long S_addr;
} S_un;
#define s_addr S_un.S_addr //can be used for most tcp & ip code
#define s_imp S_un.S_un_w.s_w2 // imp
#define s_net S_un.S_un_b.s_b1 // network
#define s_host S_un.S_un_b.s_b2 // host on imp
#define s_lh S_un.S_un_b.s_b3 // logical host
#define s_impno S_un.S_un_b.s_b4 // imp
}
十一章转换函数
unsign long WSAAPI inet_addr(const char FAR * cp);
描述:
将一个点分十进制表示的ipv4地址转换为一个32位的二进制描述的网络字节序地址
参数:
cp有四种形式,a.b.c.d, a.b.c, a.b a
返回值
成功返回一个32位二进制描述的网络字节序地址;
如果传入字符串不是合法的地址,函数失败返回INADDR_NONE。(注意:INADDR_NONE = 0xffffffff,如果字符串为广播地址“255.255.255.255”,函数返回值也是 0xffffffff,与出错时的返回值相同)
char FAR *WSAAPI inet_ntoa(struct in_addr in);
描述:
将一个ipv4结构体地址转换为点分十进制地址字符串
参数:
struct in_addr 结构体对象
返回值:
成功返回一个指向静态(static)缓冲区的指针,是可现实的ascII字符串,包含点分十进制描述的网络地址;
失败返回NULL。(注意:函数返回的字符串所用的内存是winsock分配,so要使用这个字符串需要调用者保存此字符串的副本)
第十二章函数_同步名字解析
hostent结构体
struct hostent
{
char FAR * h_name; /* official name of host */
char FAR * FAR * h_aliases; /* alias list */
short h_addrtype; /* host address type */
short h_length; /* length of address */
char FAR * FAR * h_addr_list; /* list of addresses */ 网络字节序地址
#define h_addr h_addr_list[0] /* address, for backward compat */
};
struct hostent FAR * WSAAPI gethostbyname( const char FAR * name );
struct hostent FAR * WSAAPI gethostbyaddr(const char FAR * addr, int len, int type );
描述:
根据应用程序传入的主机名(或者ip地址)得到与主机有关的信息,
要使用返回的信息,需要调用者复制一份该结构体
参数:
name:要解析的主机名字,注意不能解析ip地址。当为空字符串,或者NULL时,得到的本机的信息
addr:指向struct in_addr结构体的指针。
len: 地址的长度,对于ipv4长度就是4
type: 地址类型,如ipv4为AF_INET
返回值:
成功返回一个指向hostent结构体的指针;
失败返回NULL,应用程序可以通过WSAGetLastError()得到具体的错误代码。
servent结构体
struct servent
{
char FAR * s_name; /* official service name */
char FAR * FAR * s_aliases; /* alias list */
short s_port; // port 网络字节序
char FAR * s_proto; /* protocol to use */
};
struct servent FAR * WSAAPI getservbyname( char FAR * name, const char FAR * proto );
struct servent FAR * WSAAPI getservbyport( int port, const char FAR * proto );
描述:
根据名字或者端口号查看服务信息(ftp,telnet,http等),
从本地系统的配置文件WindowsSystem32driversetcservices查询
(PS: 这个服务在网络协议里面就是应用层协议)
参数:
name:服务的名字
port: 服务的端口
proto: 传输层协议,比如“tcp”
返回值:
成功返回指向servent结构体的指针;
失败返回NULL,可以调用WSAGetLastError()得到具体的错误码
protoent结构体
struct protoent
{
char FAR * p_name; /* official protocol name */
char FAR * FAR * p_aliases; /* alias list */
short p_proto; /* protocol 主机字节序
};
struct protoent FAR * WSAAPI getprotobynumber(int number);
struct protoent FAR * WSAAPI getprotobyname( const char FAR * name );
描述:
根据协议名字或者协议编号(在tcp/ip协议簇里面的报文头里面的号码),查询协议相关信息。
从本地系统的配置文件WindowsSystem32driversetcprotocol文件中查询
(PS: 这个协议在网络协议里面就是传输层跟网络层的协议)
参数:
number:协议的编号
name:协议的名字
返回值:
成功返回指向protoent结构体的指针;
失败返回NULL,调用者可以调用WSAGetLastError()得到具体的错误信息
十三章 异步名字解析
HANDLE WSAAPI WSAAsyncGetHostByName(
HWND hWnd,
u_int wMsg,
const char FAR * name,
char FAR * buf,
int buflen);
HANDLE WSAAPI WSAAsyncGetHostByAddr(
HWND hWnd,
u_int wMsg,
const char FAR * addr,
int len,int type,
char FAR * buf,
int buflen);
描述:
通过名字或地址进行主机名的异步查询
参数:
hWnd:应用程序窗口句柄,异步操作完成时,该句柄指向的窗口会收到wMsg消息
wMsg:请求完成时收到的消息编号,由应用程序自己定义
name:主机名字,以' '结束
addr: 主机地址,按网络字节序保存
len: addr的长度
buf: 包含查询结果的数据缓冲区,返回的数据其实是hostent结构体,建议大小是
AXGETHOSTSTRUCT
返回值:
成功返回异步操作的句柄;
失败返回0,调用WSAGetLastError()可以得到具体的错误码。