在数据包中的IP地址是ULONG,他在内存中是怎么排放的???

能动力 2003-08-22 04:26:34
是不是按照:
例如:IP是:218.13.2.8
那么分成四个字节,第一个是218,第二个是13......,我这样理解对不对?????
...全文
72 6 打赏 收藏 转发到动态 举报
写回复
用AI写文章
6 条回复
切换为时间正序
请发表友善的回复…
发表回复
kunjun_oy 2003-08-27
  • 打赏
  • 举报
回复
数的表示有两种,一种是网络字节顺序,另一种是主机字节顺序。
在内存中是主机字节顺序,一个long数0x01020304在内存中是0x04,0x03,0x02,0x01
而网络传送的地址要求是网络字节顺序,上面的数对应的是0x01,0x02,0x03,0x04
主机字节顺序到网络字节顺序的转换函数是htons,htonl
windbells 2003-08-23
  • 打赏
  • 举报
回复
在windows下应该是8,2,13,218吧,linux下应该还是218,13,2,8
zhouyong0371 2003-08-23
  • 打赏
  • 举报
回复
inet_ntoa
The Windows Sockets inet_ntoa function converts an (Ipv4) Internet network address into a string in Internet standard dotted format.


char FAR * inet_ntoa(
struct in_addr in
);
Parameters
in
[in] Structure that represents an Internet host address.
in_addr
The Windows Sockets in_addr structure represents a host by its Internet address.

struct in_addr {
union {
struct { u_char s_b1,s_b2,s_b3,s_b4; } S_un_b;
struct { u_short s_w1,s_w2; } S_un_w;
u_long S_addr;
} S_un;
};
Members
S_un_b
Address of the host formatted as four u_chars.
S_un_w
Address of the host formatted as two u_shorts.
S_addr
Address of the host formatted as a u_long.

zhouyong0371 2003-08-23
  • 打赏
  • 举报
回复
你的理解是不正确的,ULONG的IP只是一个数值,具体怎么存放我也不知道,他和字符串形式的IP需要转换才能得到。
void CGetNameFromIPDlg::OnGet()
{
// TODO: Add your control notification handler code here
char m_strAddr[15];

m_HostAddr.GetWindowText(m_strAddr,15);

WSAData wsaData;
DWORD Addr;
//初始化套接字
WSAStartup(MAKEWORD(2,2),&wsaData);

//inet_addr()函数返回一个指向honstent的结构体地址
Addr = inet_addr(m_strAddr); //将字符串形式转换。

HOSTENT * hos;

hos=gethostbyaddr((char*)&Addr,sizeof(Addr),PF_INET);

if(hos!=NULL)
{
MessageBox(hos->h_name,"The host using this IP");
}
else
{
MessageBox("Can't get the host name using this IP.","Failure");
}
}
VCP4 2003-08-22
  • 打赏
  • 举报
回复
好像是一个累加的值。
mme 2003-08-22
  • 打赏
  • 举报
回复
不是这样的
网络编程-PING程序设计实验指导书 一.实验目的 (1)熟悉原始套接字编程。 (2)了解网络的结构。 (3)了解网络传输底层协议。 二.实验要求 PING程序是用于测试网络连通性的程序。要求在WINDOWS环境下实现基本的PING程序 功能. 在命令提示符下输入: PING ***.***.***.*** 其***为目的主机的IP地址,不要求支持域名,对是否带有开关变量也不做要求。 不带开关变量时,要求返回4次响应。 返回信息的格式: REPLY FROM ***.***.***.*** 或 REQUEST TimeOut (无法PING通的情况) 三.实验原理 1、PING的工作原理 ping 程序是用来探测主机到主机之间是否可通信,如果不能ping到某台主机,表明不能和这 台主机建立连接。ping 使用的是ICMP协议,它发送ICMP回送请求消息给目的主机。ICMP协议规定:目的主机必 须返回ICMP回送应答消息给源主机。如果源主机在一定时间内收到应答,则认为主机可 达。 ICMP协议通过IP协议发送的,IP协议是一种无连接的,不可靠的数据包协议。因此, 保证数据送达的工作应该由其他的模块来完成。其一个重要的模块就是ICMP(网络控制 报文)协议。 当传送IP数据包发生错误--比如主机不可达,路由不可达等等,ICMP协议将会把错 误信息封包,然后传送回给主机。给主机一个处理错误的机会,这也就是为什么说建立 在IP层以上的协议是可能做到安全的原因。ICMP数据包由8bit的错误类型和8bit的代码 和16bit的校验和组成。而前 16bit就组成了ICMP所要传递的信息。 PING利用ICMP协议包来侦测另一个主机是否可达。原理是用类型码为0的ICMP发请求 ,受到请求的主机则用类型码为8的ICMP回应。ping程序来计算间隔时间,并计算有多少 个包被送达。用户就可以判断网络大致的情况。 IP数据报 TCP/IP协议定义了一个在因特网上传输的包, 称为IP数据报(IP datagram). 这是一个与硬件无关的虚拟包, 由包头和数据两部分组成, 包头的源地址和目的地址都是IP协议地址. ICMP TCP/IP组件包括一个ICMP(Internet Control Message Protocol)协议, 该协议定义了的报文类型: Echo,Echo Reply,用于ping程序的基本实现 下图是ICMP报文的传送: 2、RAW模式的SOCKET编程 PING程序是面向用户的应用程序,该程序使用ICMP的封装机制,通过IP协议来工作。为 了实现直接对IP和ICMP包进行操作,实验使用RAW模式的SOCKET编程。 熟悉SOCKET的编程,包括基本的系统调用如SOCKET、BIND等. 3、具体内容 (1) 定义数据结构 需要定义好IP数据报、ICMP包等相关的数据结构 (2) 程序实现 在WINDOWS环境下实现PING程序 四. 实验步骤和注意事项 1、 熟悉IP以及ICMP协议的工作机制 2、 熟悉RAW模式的SOCKET编程 3、编写PING的实现程序 4、编译环境需要包括SOCKET库 WS2_32.lib 5、 在模拟实现环境下调试并运行自己编写的PING程序 6、最后提交源程序,撰写实验报告 初步流程图 具体步骤 1、定义IP头和ICMP头 该程序定义自己的IP头和ICMP头数据结构,代码如下: //IP首部数据结构 typedef struct iphdr { unsigned int h_len : 4 ; //首部长度 unsigned int version : 4 ; //版本 unsigned char tos ; //服务类型 unsigned short total_len ; //报文总长度 unsigned short ident ; //标识 unsigned short frag_and_flags ; //偏移量 unsigned char ttl ; //寿命 unsigned char proto ; //协议 unsigned short checksum ;// 首部校验和 unsigned int sourceIP ;// 源站IP unsigned int destIP ;// 目的站IP }; //ICMP首部数据结构 typedef struct icmphdr { BYTE i_type ; //类型 BYTE i_code ; //代码 USHORT i_cksum ; //首部校验和 USHORT i_id ; //标识 USHORT i_seq ; //序列号 ULONG timestamp ; //时间戳 }; 2.定义变量 WSADATA wsaDa

18,356

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC 网络编程
c++c语言开发语言 技术论坛(原bbs)
社区管理员
  • 网络编程
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧