在c++ mfc中出现byte word dword 有什么实用意义
主要是为了在编写和阅读源码时方便。
它们在windef.h的头文件中被定义。
typedef unsigned char BYTEtypedef unsigned short WORD;typedef unsigned long DWORD具体的意思:BYTE:8-bit整数,未带正负号DWORD:32-bit整数,未带正负号WORD:16-bit 整数 ,未带正负号
c语言中的word和byte是什么数据类型啊
Windows2000在TCP/IP协议组件上做了很多改进,功能也有增强。
比如在协议栈上的调整,增大了默认窗口大小,以及高延迟链接新算法。
同时在安全性上,可应用IPSec加强安全性,比NT下有不少的改进。
Microsoft TCP/IP 组件包含“核心协议”、“服务”及两者之间的“接口”。
传输驱动程序接口 (TDI) 与网络设备接口规范 (NDIS) 是公用的。
此外,还有许多用户模型应用程序的更高级接口。
最常用的接口是 Windows Sockets、远程过程调用 (RPC) 和 NetBIOS。
Windows Sockets 是一个编程接口,它是在加州大学伯克利分校开发的套接字接口的基础上定义的。
它包括了一组扩展件,以充分利用 Microsoft Windows 消息驱动的特点。
规范的 1.1 版是在 1993 年 1 月发行的,2.2.0 版在 1996 年 5 月发行。
Windows 2000 支持 Winsock 2.2 版。
在Winsock2中,支持多个传输协议的原始套接字,重叠I/O模型、服务质量控制等。
这里介绍Windows Sockets的一些关于原始套接字(Raw Socket)的编程。
同Winsock1相比,最明显的就是支持了Raw Socket套接字类型,通过原始套接字,我们可以更加自如地控制Windows下的多种协议,而且能够对网络底层的传输机制进行控制。
1、创建一个原始套接字,并设置IP头选项。
SOCKET sock; sock = socket(AF_INET,SOCK_RAW,IPPROTO_IP); 或者: s = WSASoccket(AF_INET,SOCK_RAW,IPPROTO_IP,NULL,0,WSA_FLAG_OVERLAPPED); 这里,我们设置了SOCK_RAW标志,表示我们声明的是一个原始套接字类型。
创建原始套接字后,IP头就会包含在接收的数据中,如果我们设定 IP_HDRINCL 选项,那么,就需要自己来构造IP头。
注意,如果设置IP_HDRINCL 选项,那么必须具有 administrator权限,要不就必须修改注册表: HKEY_LOCAL_MACHINE\System\CurrentControlSet\Services\Afd\Parameter\ 修改键:DisableRawSecurity(类型为DWORD),把值修改为 1。
如果没有,就添加。
BOOL blnFlag=TRUE; setsockopt(sock, IPPROTO_IP, IP_HDRINCL, (char *)&blnFlag, sizeof(blnFlag); 对于原始套接字在接收数据报的时候,要注意这么几点: 1、如果接收的数据报中协议类型和定义的原始套接字匹配,那么,接收的所有数据就拷贝到套接字中。
2、如果绑定了本地地址,那么只有接收数据IP头中对应的远端地址匹配,接收的数据就拷贝到套接字中。
3、如果定义的是外部地址,比如使用connect(),那么,只有接收数据IP头中对应的源地址匹配,接收的数据就拷贝到套接字中。
2、构造IP头和TCP头 这里,提供IP头和TCP头的结构: // Standard TCP flags #define URG 0x20 #define ACK 0x10 #define PSH 0x08 #define RST 0x04 #define SYN 0x02 #define FIN 0x01 typedef struct _iphdr //定义IP首部 { unsigned char h_lenver; //4位首部长度+4位IP版本号 unsigned char tos; //8位服务类型TOS unsigned short total_len; //16位总长度(字节) unsigned short ident; //16位标识 unsigned short frag_and_flags; //3位标志位 unsigned char ttl; //8位生存时间 TTL unsigned char proto; //8位协议 (TCP, UDP 或其他) unsigned short checksum; //16位IP首部校验和 unsigned int sourceIP; //32位源IP地址 unsigned int destIP; //32位目的IP地址 }IP_HEADER; typedef struct psd_hdr //定义TCP伪首部 { unsigned long saddr; //源地址 unsigned long daddr; //目的地址 char mbz; char ptcl; //协议类型 unsigned short tcpl; //TCP长度 }PSD_HEADER; typedef struct _tcphdr //定义TCP首部 { USHORT th_sport; //16位源端口 USHORT th_dport; //16位目的端口 unsigned int th_seq; //32位序列号 unsigned int th_ack; //32位确认号 unsigned char th_lenres; //4位首部长度/6位保留字 unsigned char th_flag; //6位标志位 USHORT th_win; //16位窗口大小 USHORT th_sum; //16位校验和 USHORT th_urp; //16位紧急数据偏移量 }TCP_HEADER; TCP伪首部并不是真正存在的,只是用于计算检验和。
校验和函数: USHORT checksum(USHORT *buffer, int size) { unsigned long cksum=0; while (size > 1) { cksum += *buffer++; size -= sizeof(USHORT); } if (size) { cksum += *(UCHAR*)buffer; } cksum = (cksum >> 16) + (cksum & 0xffff); cksum += (cksum >>16); return (USHORT)(~cksum); } 当需要自己填充IP头部和TCP头部的时候,就同时需要自己计算他们的检验和。
3、发送原始套接字数据报 填充这些头部稍微麻烦点,发送就相对简单多了。
只需要使用sendto()就OK。
sendto(sock, (char*)&tcpHeader, sizeof(tcpHeader), 0, (sockaddr*)&addr_in,sizeof(addr_in)); 下面是一个示例程序,可以作为SYN扫描的一部分。
#include #include #include #define SOURCE_PORT 7234 #define MAX_RECEIVEBYTE 255 typedef struct ip_hdr //定义IP首部 { unsigned char h_verlen; //4位首部长度,4位IP版本号 unsigned char tos; //8位服务类型TOS unsigned short total_len; //16位总长度(字节) unsigned short ident; //16位标识 unsigned short frag_and_flags; //3位标志位 ...
一个C++程序 输出数据类型长度
上面大魔导师的说法不对,用这个例子就可以知道:#include#includevoid main() { struct example { char b; char c; int d; double a; short e; short f;}y; cout} 输出仍然是24,按照大魔导师的说法,应该是28才对……目前找到的最好的解释为:这里涉及到字节对齐,字节对齐的细节和编译器实现相关,但一般而言,满足三个准则:1) 结构体变量的首地址能够被其最宽基本类型成员的大小所整除;2) 结构体每个成员相对于结构体首地址的偏移量(offset)都是成员大小的整数倍,如有需要编译器会在成员之间加上填充字节(internal adding);3) 结构体的总大小为结构体最宽基本类型成员大小的整数倍,如有需要编译器会在最末一个成员之后加上填充字节(trailing padding)。
在你的例子中:第一个double型占了8个字节,接下来的char b的偏移量是8,可以被sizeof(char)整除,因此它占用一个字节,char c偏移量是9,也占一个字节,int d偏移量是10,不是sizeof(int)=4的整数倍,要将其放到偏移量为12的位置,因此编译器在char c后填充了2个字节,使偏移量为12,int d占4字节,接下来的short e的偏移量为16,满足条件(2),short e占用2个字节,一共占用了18个字节,根据(3),编译器在short e后填充6个字节得到24字节;在我举的例子中,接下来再加1到3个short类型变量仍然为24个字节,但是如果添加4个short类型变量,则变为32个字节了更详细的全套说明在:http://blog.csdn.net/freefalcon/archive/2004/07/28/54839.aspx
单字节、双字节、4字节都是什么意思
展开全部 单字节指只占一个字,是英文字符。
双字是占两个字节的,中文字符都占两个字节 计算机中的数据都是以0和1来表示的,其中一个0或者一个1称之为一位,8位称为一个字节(Byte),两个字节称为一个字(Word)(双字节),4个字节称为双字(Dword)(四字节)。
单字节的英文是Byte;比特是最小的数值单位,它的英文是Bit。
一个字节包含8个比特,通常计算机初学者接触到的ASCII码就是单字节字符,由于计算机是二进制的,1个比特位只可以表示为0或者1这两种数,那8个比特(一般从右至左)就可以有0~127(2的8次方再减1)的不同的数值表示。
双字节字符即是包含了两个字节共16比特。
一般比较好理解的就是:英文字母属于单字节字符,而汉字则属于双字节字符。
因为英文字母、数字、符号等完全可以用128种不同的数值来表示,而汉字太多则不能,所以才需要扩展到双字节。
...
转载请注明出处51数据库 » c byte word dword用
忘事儿的菲芸