将网络地址(u_long)转化为点分十进制ip地址
2013-01-28 14:19
113 查看
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) 要不然 也会返回错误
用法: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()与该端口进行数据报的发送与接收。
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()与该端口进行数据报的发送与接收。
相关文章推荐
- 网络 发一个Long类型的数转化为字节数组从客户端发到服务端
- NAT-netwrok address translation(网络地址转化)帮你快速通俗的理解
- unsigned long整型数字转化成IP地址的实现
- 网络编程__网络字节序和地址字节序转化
- 网络地址格式及域名地址转化
- NAT--网络地址转化
- 【网络】无法解析服务器的DNS地址?;能登陆QQ,无法打开网页
- Fedora/centos Linux如何设置网卡自动获取网络地址
- 接入广域网技术――NAT内、外部网络地址转换
- 网络地址转换(NAT)
- IP地址、子网掩码、网络号、主机号、网络地址、主机地址
- 子网掩码、ip地址、主机号、网络号、网络地址、广播地址
- IP地址、子网掩码、网络号、主机号、网络地址、主机地址
- String、int。long之间的相互转化
- 网络地址转换NAT原理及其作用
- NAT网络地址转换的3种实现方式:
- iOS开发中,通过URL地址获取网络上的图片
- 玩转网络MAC地址
- 计算机网络(六) 网络层--硬件地址与ARP