主机网络信息程序工程硕士邓荣飞Word格式文档下载.docx
- 文档编号:15878279
- 上传时间:2022-11-16
- 格式:DOCX
- 页数:13
- 大小:70.17KB
主机网络信息程序工程硕士邓荣飞Word格式文档下载.docx
《主机网络信息程序工程硕士邓荣飞Word格式文档下载.docx》由会员分享,可在线阅读,更多相关《主机网络信息程序工程硕士邓荣飞Word格式文档下载.docx(13页珍藏版)》请在冰豆网上搜索。
报告人:
邓荣飞班级:
工程硕士2011
实验时间:
2011年10月27日
实验报告提交时间:
2011年11月8日
教务处制
主机网络信息程序
1、主机网络信息编程工具开发包介绍
网络中的主机需要安装TCP/IP协议或其他协议才能进行通信,网络应用程序有时需要获取主机上与网络有关的信息,这些信息一般存放在数据文件中。
与网络有关的信息主要包括以下4大类:
□主机信息:
与主机有关的信息,函数名一般以gethostby开头,在程序中较多使用。
□网络信息:
与网络有关的信息,函数名一般以getnetby开头,在程序中较少使用。
□协议信息:
与网络协议有关的信息,函数名一般以getprotoby开头,在程序中较少使用。
□服务信息:
与网络提供的服务有关的信息,函数名一般以getservby开头,在程序中较多使用。
1)获得主机名---gethostname()
gethostname()函数用来获得一台主机的名称信息:
intgethostname(
__outchar*name,//一个指向将要存放主机名的缓冲区的指针
__inintnamelen//缓冲区的长度
);
如果函数调用成功,则返回0;
如果调用失败,则返回SOCKET_ERROR错误信息。
可以通过调用WSAGetLastError()来得到一个特定的错误代码,错误代码说明如下:
WSAEFAULT//名字长度参数太小
WSANOTINITIALISED//在应用这个API前,必须成功调用WSAStartup()
WSAENETDOWN//WindowsSockets实现检测到了网络子系统的错误
WSAEINPROGRESS//一个阻塞WindowsSockets操作正在进行
该函数把本地主机名存放入由name参数指定的缓冲区。
主机名的形式取决于WindowsSockets系统的实现,它可能是一个简单的主机名,或者是一个域名。
不管是哪种形式,该函数返回的名字必定可以在gethostbyname()和WSAAsyncGetHostByName()函数中使用。
2)获得与套接字相连的远程协议地址---getpeername()
getpeername()函数格式如下:
intgetpeername(
__inSOCKETs,//一个已经建立连接的套接字描述字
__outstructsockaddr*name,//指向返回的远程协议地址
__inoutint*namelen//远程协议地址长度
函数调用成功,返回0;
调用失败,则返回SOCKET_ERROR错误信息,可以调用WSAGetLastError()函数来获取对该错误的进一步描述,错误代码如下:
WSANOTINITIALISED//在使用此函数前应成功调用WSAStartup()
WSAENETDOWN//Windows套接字实现检测到网络子系统失效
WSAEFAULT//namelen参数不够大
WSAEINPROGRESS//一个阻塞Windows套接口调用正在进行中
WSAENOTCONN//套接口未建立连接
WSAENOTSOCK//描述字不是一个套接口
getpeername()函数用于从套接口s中获取与它绑定的远程协议的地址信息,并将它存放在sockaddr类型的name结构中。
它只能用于已经建立连接的套接口。
对于数据报类型的套接口来说,它只能返回先前调用connect()函数时使用的对等端信息,在sendto()函数中使用过的对等端信息不能被返回。
3)获得套接口本地协议地址---getsockname()
getsockname()函数的格式如下:
intgetsockname(
__inSOCKETs,//标识一个套接口描述字
__outstructsockaddr*name,//指向返回的本地协议地址的指针
__inoutint*namelen//本地协议地址长度,当函数调用完成后,它可以返回实际的本地地址长度
调用成功返回0,失败则返回SOCKET_ERROR错误信息,可以通过调用WSAGetLastError()函数获取进一步错误描述。
错误代码如下:
WSANOTINITIALISED//在使用此API之前应成功调用WSAStartup()
WSAENETDOWN//Windows套接口实现检测到网络子系统失效
WSAEINPROGRESS//一个阻塞的Windows套接口调用正在进行中
getsockname()函数用于获取一个套接口的协议地址,它用于一个已绑定或已连接套接口。
本调用特别适用于如下情况:
未调用bind()就调用了connect(),这时唯有getsockname()调用可以获知系统内定的本地地址。
在返回时,namelen参数包含了名字的实际字节数。
若一个套接口与INADDR_ANY绑定,即该套接口可以用任意的主机地址,此时除非调用connect()或accept()来连接,否则getsockname()将不会返回主机IP地址的任何信息。
除非套接口被连接,Windows套接口应用程序不应假设IP地址会从INADDR_ANY编程其他地址。
这是因为对于一个有多个IP地址的主机来说,除非套接口被连接,否则该套接口所用的IP地址是不可知的(即不能确定是哪一个)。
4)根据主机名取得主机信息---gethostbyname()或WSAAsyncGetHostByName()
这两个WinsockAPI函数从主机数据库取回与指定的主机名对应的主机信息。
这两个函数均返回一个hostent结构型的变量:
typedefstructhostent{
charFAR*h_name;
//正式的主机名
charFARFAR**h_aliases;
//二维字符指针,返回一台主机的所有别名(即别名列表)
shorth_addrtype;
//主机地址类型,如AF_INET表示IPv4地址
shorth_length;
//可以返回主机地址的字节数
charFARFAR**h_addr_list;
//返回一台主机的所有IP地址。
这个数组中的每个
//地址都是按网络字节顺序返回的。
一般情况下,应用程
//序都采用该数组的第一个地址。
但是如果返回的地址不止//一个,应用程序就会相应地选择一个最恰当的地址,
//而不是一直都用第一个地址
}HOSTENT,*PHOSTENT,FAR*LPHOSTENT;
在Winsock1中提供的gethostbyname()函数格式如下:
structhostent*FARgethostbyname(
__inconstchar*name//一个指向主机名的指针
5)在Winsock1中提供的异步扩展WSAAsyncGetHostByName()函数的格式是:
HANDLEWSAAsyncGetHostByName(
__inHWNDhWnd,//一个窗口句柄,表示异步请求完成时,该窗口句柄应该收到一条消息
__inunsignedintwMsg,//当异步请求完成时,将要接收的消息
__inconstchar*name,//指向主机名的指针
__outchar*buf,//接收hostent数据的数据区指针。
该数据区必须大于hostent结构的大小,这是因为
//WindowsSockets实现不仅要用该数据区容纳hostent结构,而且hostent结构的成员引用的所有
//数据也要在该区域内。
建议用户提供一个MAXGETHOSTSTRUCT字节大小的缓冲区
__inintbuflen//buf的大小
调用成功,gethostbyname()函数返回hostent结构的指针,调用失败则返回一个空指针,调用WSAGetLastError()得到特定的错误代码:
WSANOTINITIALISED//应用这个API前,必须成功调用WSAStartup()
WSAHOST_NOT_FOUND//没有找到授权应答的主机
WSATRY_AGAIN//没有找到非授权主机,或者服务器故障(SERVERFAIL)
WSANO_RECOVERY//无法恢复的错误,如查询格式错误(FORMERR)、拒绝服务(REFUSED)
WSANO_DATA//有效的名字,但没有关于请求类型的数据记录
WSAEINPROGRESS//一个阻塞的WindowsSockets操作正在进行
WSAEINTR//阻塞调用被WSACancelBlockingCall()取消了
WSAAsyncGetHostByName()函数是gethostbyname()函数的Windows异步扩展函数。
所谓异步,指的是WindowsSockets的实现启动该操作后立即回到调用方,并传回一个异步任务句柄,应用程序可以用它来标识该操作。
当异步操作完成时,如果成功则将主机名和地址信息拷贝到buf缓冲区中,同时向句柄为hWnd的应用程序窗口发送一条消息(wMsg)。
wParam参数包含了初次函数调用时返回的异步任务句柄,lParam的高16位包含着错误代码。
错误代码为0说明异步操作成功,在成功完成的情况下,提供给初始函数调用的缓冲区中包含额一个hostent结构。
错误代码为WSAENOBUFS,则说明初始调用时有buflen指出的缓冲区大小太小;
在这种情况下,lParam的低16位提供所有信息所需的缓冲区大小。
错误代码和缓冲区大小应使用WSAGETASYNCERROR和WSAGETASYNCBUFLEN宏从lParam中取出。
这两个宏定义为:
#defineWSAGETASYNCBUFLEN(lParam)LOWORD(lParam)
#defineWSAGETASYNCERROR(lParam)HIWORD(lParam)
使用这些宏可以最大限度的提供程序源代码的可移植性。
函数的返回值指出异步操作是否成功启动,注意它并不隐含操作本身成功与否。
若操作成功,则WSAAsyncGetHostByName()返回一个HANDLE类型的非0值,它用来标识该异步请求任务的句柄。
通过该句柄使用WSACancelAsyncRequest()函数可取消该操作,也可通过检查wParam消息参数,以匹配异步操作和完成消息。
如果异步操作不能启动,WSAAsyncGetHostByName()返回一个0值,使用WSAGetLastError()得到下面错误代码:
WSANOTINITIALISED//在使用本API前必须进行一次成功的WSAStartup()调用
WSAENETDOWN//WindowsSockets实现检测到了网络子系统的错误
WSAEWOULDBLOCK//本异步操作此时由于WindowsSockets实现的资源或其他限制的制约而无法
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 主机 网络 信息 程序 工程硕士 邓荣飞