地址家族名字解析学习笔记

    技术2022-05-11  75

    Wi n s o c k中,应用通过S O C K A D D R _ I N结构来指定I P地址和服务端口信息,该结构的格式如下: struct sockaddr_in { short sin_family; u_short sin_port; struct in_addr sin_addr; char sin_zero[8]; }; s i n _ f a m i l y字段必须设为A F _ I N E T,以告知Wi n s o c k我们此时正在使用I P地址家族。 准备使用哪个T C P或U D P通信端口来标识服务器服务这一问题,则由s i n _ p o r t字段定义。如果发现要绑定的端口已经被占用会返回一个WSAEADDRINUSE错误。 sin_addr字段用于把一个IP地址保存到一个4字节无符号整数类型中 sin_zero只充当填充项的责任,以使SOCKADDR_IN结构和SOCKADDR结构的长度一样 (inet_addr函数可以把一个点式的IP地址转换成一个32位的无符号长整数,定义为: unsigned long inet_addr( const char FAR* cp ); //cp字段是一个空终止字符串,它接受通常使用的点格式 ) 特殊地址:对于特定情况下的套接字行为,有两个特殊I P 地址可对它们产生影响。特殊地址I N A D D R _ A N Y允许服务器应用监听主机计算机上面每个网络接口上的客户机活动。一般情况下,在该地址绑定套接字和本地接口时,网络应用才利用这个地址来监听连接。如果你有一个多址系统,这个地址就允许一个独立应用接受发自多个接口的回应。特殊地址I N A D D R _ B R O A D C A S T用于在一个I P网络中发送广播U D P数据报。要使用这个特殊地址,需要应用设置套接字选项S O _ B R O A D C A S T。 字节顺序一共有两种方法表示多字节编号,主机顺序:从最无意义到最有意义的顺序,INTER 86处理器用的就是这种方式。网络顺序:从最有意义到最无意义。互联网标准。 将一个数从主机顺序转换为网络顺序的函数有: u_long htonl(u_long hostlong); int WSAHtonl( SOCKET s; u_long hostlong; //主机顺序的4字节数 u_long FAR* lpnetlong //返回的网络字节顺序 ); u_short htons(u_short hostshort); int WSAHtons( SOCKET s; u_short hostshort; //主机顺序的2字节数 u_short FAR* lpnetshort //返回的网络字节顺序 ); 把网络字节顺序转换为主机字节顺序的函数有: 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 ); winsock提供了两个函数g e t h o s t b y n a m e和WSAAsynGetHostByName用来支持名字解释,把主机名转换为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地址组成的空终止数组(一个主机名对应多个地址) }; struct hostent FAR* gethostbyname( const char FAR* name ); HANDLE WSAAsyncGetHostByName( //gethostbyname的异步版本 HWND hWnd; //接受消息的窗口句柄 unsigned int wMsg; //接收到的窗口消息 const char FAR* name; //主机名 char FAR* buf; //只想接收HOSTENT数据的那个数据域大小应设为MAXGETHOSTSTRUCT int buflen ); g e t h o s t b y a d d r和WSAAsynGetHostByName API函数,它们是为获得与I P网络地址相应的主机信息而设计的。 struct HOSTENT FAR* gethostbyaddr( const char FAR* addr; //指向IP地址的指针按网络字节顺序排列 int len; int type //指定AF_INET值 ); g e t s e r v b y n a m e和W S A A s y n c G e t S e r v B y N a m e函数,便可获得已知服务的端口号。 struct servent FAR* getservbyname( const char FAR* name; const char FAR* proto ); 红外线.............. IPX/SPX............. NetBIOS............. AppleTalk(苹果公司)...... ATM(异步传输模式协议).....  

    最新回复(0)