将网络地址(u_long)转化为点分十进制ip地址

来源:互联网 发布:域名被别人注册成商标 编辑:程序博客网 时间:2024/04/20 17:07

wchar_t *buf =  new wchar_t(15);
u_long a = 1955339436;
BYTE *cp = (BYTE *)&a;
(void) swprintf(buf, L"%u.%u.%u.%u", cp[0], cp[1], cp[2], cp[3]);

 

 

 

 //获取主机的信息
 LPHOSTENT hostEntry;
 char hostname[MAX_NUM_BUF];
 gethostname(hostname,MAX_NUM_BUF);   //获取主机名称
 hostEntry = gethostbyname(hostname);  //获取主机信息
 if(!hostEntry)
 {
  ShowErrorMsg();       //显示错误信息
  return ExitClient(CLIENT_API_ERROR); //退出
 }
 //设置sockaddr_in
 SOCKADDR_IN addrServ;
 addrServ.sin_family = AF_INET;
 addrServ.sin_addr = *((LPIN_ADDR)*hostEntry->h_addr_list);
 addrServ.sin_port = htons(SERVERPORT);

//客户端地址设置

addr.sin_family = AF_INET;
addr.sin_port=htons(PORT);
addr.sin_addr.s_S_un.s_addr = inet_addr(SERVER_IP);
 
基于阻塞型 tcp 的套接字
1 :recv()函数的 缓冲区  一定不能是用过的  要不然  recv会返回 错误
2 :accept()函数中的 第三个参数   要有 初始值 sizeof(SOCKADDR) 要不然  也会返回错误

四、几个需要注意的函数

(1)IP地址相关,inet_addr()和inet_ntoa()

用法:inet_addr(“127.0.0.1”);将点分十进制记的IP地址转换成为网络字节序的S_addr类型的IP地址

           inet_ntoa(addrClient.sin_addr);将网络字节序的S_addr类型的IP地址转换成为点分十进制记的IP地址

(2)端口号相关,htonl()和htons()

用法:htonl(INADDR_ANY);把一个u_long类型的值从主机字节序转换成为TCP/IP网络字节顺序

           htons(6000);把一个u_short类型的值从主机字节序转换成为TCP/IP网络字节顺序

           INADDR_ANY这个宏的值就是0,转换之后仍然是0

5::关于端口号
0--65535  0不能用  65535 可以  还有1024为系统 留给预定义的 端口  我们也能用 但是肯定会干扰 其他服务。。。

1  为了标识通信实体中进行通信的进程(应用程序),TCP/IP协议提出了协议端口的概念

2.      端口是一种抽象的软件结构(包括一些数据结构和I/O缓冲区)。应用程序通过系统调用和某端口建立连接(binding)后,传输层传给该端口的数据都被相应的进程所接收,相应进程发给传输层的数据都通过该端口输出

3.      端口用一个整数型标识符来表示,即端口号。端口号跟协议相关,TCP/IP传输层的两个协议TCP和UDP是完全独立的的两个软件模块,因此各自的端口号也相互独立

 

SOCK_STREAM类型的套接口为全双向的字节流。对于流类套接口,在接收或发送数据前必需处于已连接状态。用connect()调用建立与另一套接口的连接,连接成功后,即可用send()和recv()传送数据。当会话结束后,调用closesocket()。带外数据根据规定用send()和recv()来接收。
实现SOCK_STREAM类型套接口的通讯协议保证数据不会丢失也不会重复。如果终端协议有缓冲区空间,且数据不能在一定时间成功发送,则认为连接中断,其后续的调用也将以WSAETIMEOUT错误返回。
SOCK_DGRAM类型套接口允许使用sendto()和recvfrom()从任意端口发送或接收数据报。如果这样一个套接口用connect()与一个指定端口连接,则可用send()和recv()与该端口进行数据报的发送与接收。

原创粉丝点击