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结构的长度
);
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结构的长度
);
相关文章推荐
- Windows网络编程经验小结
- Windows TCP协议网络编程
- [Windows网络编程课设]南工程聊天室客户端源码
- 操作系统,windows编程,网络,socket
- windows下的socket网络编程
- 网络编程(48)—— windows平台下的四种线程同步技术(二)
- 网络编程入门(windows&linux)
- 【winsock2】windows网络编程 之 UDP/IP
- 【Windows网络编程】EventSelect网络模型
- 经典编程书籍(C++, 网络, Windows, Linux)
- Windows网络编程细节问题
- WINDOWS (服务器) 和 DOS(客户端) 网络互连 基于TCP/IP的编程实现
- Windows 10开发基础——网络编程
- windows网络编程-几种模式
- 提高IOCP 效率的一些方法,技巧 (来自WINDOWS 网络编程第二版)
- windows网络编程通讯模型
- Windows网络编程:阻塞模式下的Socket编程
- windows 网络编程
- windows下面的网络编程
- windows 网络编程[转]