1.2 获取网络中计算机的IP地址和计算机名
在开发网络应用的过程中,经常需要获取网络中某台计算机的IP地址和计算机名称。在本节的内容中,将介绍如何使用Visual C++(www.cppentry.com) 6.0开发一个实现上述功能的应用程序。
1.2.1 流式套接字编程(www.cppentry.com)(1)
网络数据的传输是通过套接字实现的。套接字有3种类型:流式套接字(SOCK_ STREAM),数据报套接字(SOCK_DGRAM)及原始套接字(RAW)。在本小节的内容中,将首先讲解流式套接字编程(www.cppentry.com)的基本知识。
流式套接字是面向连接的,提供双向、有序、无重复且无记录边界的数据流服务,适用于处理大量数据,可靠性高,但开销也大,编程(www.cppentry.com)模型如图1-11所示。
|
| (点击查看大图)图1-11 流式套接字编程(www.cppentry.com)模型 |
1.服务器端编程(www.cppentry.com)步骤
(1) 在初始化阶段调用函数WSAStartup()
此函数在应用程序中初始化Windows Sockets DLL,只有此函数调用成功后,应用程序才可以再调用其他Windows Sockets DLL中的API函数。
在程序中该函数的调用形式如下:
- int WSAStartup(
- WORD wVersionRequested, //所使用WinSocket版本
- LPWSADATA lpWSAData //存储系统返回的WinSocket信息
- );
(2) 建立Socket
初始化WinSock的动态链接库后,需要在服务器端建立一个监听Socket,为此可以调用socket()函数来建立这个监听的Socket,并定义此Socket所使用的通信协议:
- SOCKET socket(
- int af, //目前只提供PF_INET(AF_INET)
- int t ype, //Socket的类型(SOCK_STREAM、SOCK_DGRAM)
- int protocol //通讯协议(如果使用者不指定则设为0)
- );
调用成功返回Socket对象,失败则返回INVALID_SOCKET(调用WSAGetLastError()可得知原因,所有WinSocket的函数都可以使用这个函数来获取失败的原因)。
如果要建立的是遵从TCP/IP协议的Socket,第二个参数type应为SOCK_STREAM,如为UDP(用户数据报协议)的Socket,type应为SOCK_DGRAM。
(3) 绑定端口
接下来要为服务器端定义的监听Socket指定一个地址及端口(Port),这样客户端才知道待会儿要连接哪一个地址的哪个端口,为此我们要调用bind()函数,该函数调用成功返回0,否则返回SOCKET_ERROR:
- int bind(
- SOCKET s, //Socket对象名
- const struct sockaddr FAR *name, //Socket的地址值,即所在机器的IP地址
- int namelen //name的长度
- );
如果使用者不在意地址或端口的值,那么可以设定地址为INADDR_ANY,及Port为0,Windows Sockets会自动将其设定为适当的地址及Port(1024到5000之间的值)。此后可以调用getsockname()函数来获知其被设定的值。