您的位置:首页 > 理论基础 > 计算机网络

Windows 网络编程(6)

2007-07-25 13:55 330 查看
1>Winsock 中,应用通过SOCKADDR_IN结构来指定IP地址和服务端口信息:

struct sockaddr_in

{

short sin_family; //必须 AF_INET (即IP地址家族)

u_short sin_port; //端口

struct in_addr sin_addr; //把一个IP地址,保存为4字节数

char sin_zero; //无意义,填充使 sockaddr_in 与SOCKADDR 长度一样

};

扶助函数:

a> unsigned long inet_addr( const char FAR *cp );

说明:把一个点式IP地址转换成一个32位的 unsigned long (无符号长整数)的网络字节顺序

cp 是一个空中止字符串,它认可点式表示法的IP地址

b>主机字节顺序转换成网络字节顺序:

u_long htonl( u_long hostlong //按主机字节排序(4字节)

); //返回网络字节顺序

int WSAHtonl( SOCKET s,

u_long hostlong, //按主机字节排序(4字节)

u_long FAR * lpnetlong //返回网络字节顺序

);

n_short htons( u_short hostshort //按主机字节排序(2字节)

); //返回网络字节顺序(2字节)

int WSAHtons ( SOCKET s,

u_short hostshort, //按主机字节排序(2字节)

u_short FAR * lpnetshort ); //返回网络字节顺序(2字节)

c>网络字节顺序转换成主机字节顺序:

u_long ntohl( u_long netlong );

int WSANtohl( SOCKET s, u_long netlong, u_long FAR * lphostlong );

u_short ntohs ( u_short netshort );

int WSANtohs( SOCKET s,u_short netshort,u_short FAR * lphostshort );

例: 用 inet_addr 和 htons 函数创建 SOCKADDR_IN 结构

SOCKADDR_IN InternetAddr;

INT nPortId = 5150;

InternetAddr.sin_family = AF_INET;

InternetAddr.sin_addr.s_addr = inet_addr ("136.149.3.29");

InternetAddr.sin_port = htons( nPortId );

2>创建套接字

a>创建TCP套接字:

s = socket( AF_INET, SOCK_STREAM,0);

s = WSASocket( AF_INET,SOCK_STREAM,0,NULL,0,WSA_FLAG_OVERLAPPED);

b>创建UDP套接字:

用指定的套接字类型,代替上述的SOCK_STREAM

c>创建IP套接字:

用SOCK_RAW代替SOCK_STREAM

3>名字解析

a>HOSTENT 结构:

struct hostent

{

char FAR * h_name; //主机名

char FAR * FAR* h_aliases; //主机备用名组成的空中止数组

short h_addrtype; //即将返回的地址家族

short h_length; //对h_addr_list中的每一个地址定义字节长度进行定义

char FAR * FAR* h_addr_list; //由主机IP地址组成的空中止数组

}

b>gethostbyname 和 WSAAsynGetHostByName 函数从主机数据库中取回指定主机名对应的主机信息,

均返回 HOSTENT 结构

i> struct hostent FAR * gethostbyname(

const char FAR * name //准备查找的主机名

); //调用成功,系统会返回一个指向HOSTENT结构的指针。

说明:保存HOSTENT结构的是系统内存.应用程序不应该依靠它维护状态,也不必释放这个结构

ii>WSAAsyncGetHostByName 是 gethostbyname 的异步版,它在结束时,利用Windows消息向

应用程序发出通知:

HANDLE WSAAsyncGetHostByName

( HWND hWnd, //窗口句柄,调用结束,这个句柄收到消息

unsigned int wMsg, //异步请求结束时收到的窗口消息

const char FAR * name, //主机名

char FAR * buf, //指向接收HOSTENT数据的数据域,这个缓冲区 必须大于HOSTENT结构,应该设为MAXGETHOSTSTRUCT中定义的最大长度

int buflen

);

c>gethostbyaddr 和 WSAAsynGetHostByName 获得与IP网络地址对应的主机名

i> struct HOSTENT FAR * gethostbyaddr

( const char FAR * addr, //指向一个IP地址的指针(网张字字顺序)

int len, //指定addr 参数的字节长度

int type //指定AF_INET(即为IP地址)

);

ii>WSAAsyncGetHostByAddr 是 gethostbyaddr的异步版

iii>端口,己知的服务一般采用1至1023之间的端口,否则使用1023以上的端口

4> 其它函数

WSAAddressToString 和 WSAStringToAddress 函数,可以把SOCKADDR结构转换成一个格式化的字符串,反之也成立.目前只支持 AF_INET 和 AF_ATM 地址家族.

INT WSAAddressToString

( LPSOCKADDR lpsaAddress, //代表特定协议的SOCKADDR结构

DWORD dwAddressLength, //指定SOCKADDR结构长度

LpWSAPROTOCOL_INFO lpProtocolInfo,//可选,协议提供者

OUT LPTSTR lpszAddressString,//缓冲,它收到的是易理解的地址字串

IN OUT LPDWORD lpdwAddressStringLength //前一个参数的长度,它返回实际复制到lpszAddressStrign中的字串长度,不够大函数就失败

);

INT WSAStringToAddress

( LPTSTR AddressString, //易理解的地址串(XXX.XXX.XXX.XXX:Y)

INT AddressFamily, //指前参数的地址家族

LPWSAPROTOCOL_INFO lpProtocolInfo,

LPSOCKADDR lpAddress, //收到信息的,地址串中的SOCKADDR结构

LPINT lpAddressLength //SOCKADDR结构的长度

);
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: