网络程序设计(一)必要文件

来源:互联网 发布:js防水涂膜厚度 编辑:程序博客网 时间:2024/05/29 04:29

comm.cpp

//////////////////////////////////////////////////// comm.cpp文件#include <winsock2.h>#include <windows.h>#include "Ws2tcpip.h"#include "comm.h"USHORT checksum(USHORT* buff, int size){unsigned long cksum = 0;while(size>1){cksum += *buff++;size -= sizeof(USHORT);}// 是奇数if(size){cksum += *(UCHAR*)buff;}// 将32位的chsum高16位和低16位相加,然后取反cksum = (cksum >> 16) + (cksum & 0xffff);cksum += (cksum >> 16);return (USHORT)(~cksum);}BOOL SetTTL(SOCKET s, int nValue){int ret = ::setsockopt(s, IPPROTO_IP, IP_TTL, (char*)&nValue, sizeof(nValue));return ret != SOCKET_ERROR;}BOOL SetTimeout(SOCKET s, int nTime, BOOL bRecv){int ret = ::setsockopt(s, SOL_SOCKET, bRecv ? SO_RCVTIMEO : SO_SNDTIMEO, (char*)&nTime, sizeof(nTime));return ret != SOCKET_ERROR;}


comm.h

//////////////////////////////////////////////////// comm.h文件// 包含一些公共函数#ifndef __COMM_H__#define __COMM_H__// 校验和的计算// 以16位的字为单位将缓冲区的内容相加,如果缓冲区长度为奇数,// 则再加上一个字节。它们的和存入一个32位的双字中USHORT checksum(USHORT* buff, int size);BOOL SetTTL(SOCKET s, int nValue);BOOL SetTimeout(SOCKET s, int nTime, BOOL bRecv = TRUE);#endif // __COMM_H__


Debug.h

////////////////////////////////////////////// Debug.h文件// 调试支持#ifndef __DEBUG_H__#define __DEBUG_H__#ifdef _DEBUG#define ODS(szOut)\{\OutputDebugString(szOut);\}#define ODS1(szOut, var)\{\TCHAR sz[1024];    \_stprintf(sz, szOut, var);\OutputDebugString(sz);\}#else#define ODS(szOut)#define ODS1(szOut, var)#endif// _DEBUG#endif // __DEBUG_H__


initsock.h

//////////////////////////////////////////////////////////// initsock.h文件#include <winsock2.h>#pragma comment(lib, "WS2_32")// 链接到WS2_32.libclass CInitSock{public:CInitSock(BYTE minorVer = 2, BYTE majorVer = 2){// 初始化WS2_32.dllWSADATA wsaData;WORD sockVersion = MAKEWORD(minorVer, majorVer);if(::WSAStartup(sockVersion, &wsaData) != 0){exit(0);}}~CInitSock(){::WSACleanup();}};


protoinfo.h

//////////////////////////////////////////////////// protoinfo.h文件/*定义协议格式定义协议中使用的宏 */#ifndef __PROTOINFO_H__#define __PROTOINFO_H__#define ETHERTYPE_IP    0x0800#define ETHERTYPE_ARP   0x0806typedef struct _ETHeader         // 14字节的以太头{UCHARdhost[6];// 目的MAC地址destination mac addressUCHARshost[6];// 源MAC地址source mac addressUSHORTtype;// 下层协议类型,如IP(ETHERTYPE_IP)、ARP(ETHERTYPE_ARP)等} ETHeader, *PETHeader;#define ARPHRD_ETHER 1// ARP协议opcodes#defineARPOP_REQUEST1// ARP 请求#defineARPOP_REPLY2// ARP 响应typedef struct _ARPHeader// 28字节的ARP头{USHORThrd;//硬件地址空间,以太网中为ARPHRD_ETHERUSHORTeth_type;//  以太网类型,ETHERTYPE_IP ??UCHARmaclen;//MAC地址的长度,为6UCHARiplen;//IP地址的长度,为4USHORTopcode;//操作代码,ARPOP_REQUEST为请求,ARPOP_REPLY为响应UCHARsmac[6];//源MAC地址UCHARsaddr[4];//源IP地址UCHARdmac[6];//目的MAC地址UCHARdaddr[4];//目的IP地址} ARPHeader, *PARPHeader;// 协议#define PROTO_ICMP    1#define PROTO_IGMP    2#define PROTO_TCP     6#define PROTO_UDP     17typedef struct _IPHeader// 20字节的IP头{    UCHAR     iphVerLen;      // 版本号和头长度(各占4位)    UCHAR     ipTOS;          // 服务类型     USHORT    ipLength;       // 封包总长度,即整个IP报的长度    USHORT    ipID;  // 封包标识,惟一标识发送的每一个数据报    USHORT    ipFlags;      // 标志    UCHAR     ipTTL;      // 生存时间,就是TTL    UCHAR     ipProtocol;     // 协议,可能是TCP、UDP、ICMP等    USHORT    ipChecksum;     // 校验和    ULONG     ipSource;       // 源IP地址    ULONG     ipDestination;  // 目标IP地址} IPHeader, *PIPHeader; // 定义TCP标志#define   TCP_FIN   0x01#define   TCP_SYN   0x02#define   TCP_RST   0x04#define   TCP_PSH   0x08#define   TCP_ACK   0x10#define   TCP_URG   0x20#define   TCP_ACE   0x40#define   TCP_CWR   0x80typedef struct _TCPHeader// 20字节的TCP头{USHORTsourcePort;// 16位源端口号USHORTdestinationPort;// 16位目的端口号ULONGsequenceNumber;// 32位序列号ULONGacknowledgeNumber;// 32位确认号UCHARdataoffset;// 高4位表示数据偏移UCHARflags;// 6位标志位//FIN - 0x01//SYN - 0x02//RST - 0x04 //PUSH- 0x08//ACK- 0x10//URG- 0x20//ACE- 0x40//CWR- 0x80USHORTwindows;// 16位窗口大小USHORTchecksum;// 16位校验和USHORTurgentPointer;// 16位紧急数据偏移量 } TCPHeader, *PTCPHeader;typedef struct _UDPHeader{USHORTsourcePort;// 源端口号USHORTdestinationPort;// 目的端口号USHORTlen;// 封包长度USHORTchecksum;// 校验和} UDPHeader, *PUDPHeader;#endif // __PROTOINFO_H__