#include "stdafx.h"
#ifdef _DEBUG
#define new DEBUG_NEW
#endif
#include <ws2tcpip.h>
#include "mstcpip.h"
#include <time.h>
#ifdef _DEBUG
#define new DEBUG_NEW
#endif
#pragma comment(lib,"ws2_32")
typedef struct _TCP{
WORD SrcPort; // 源端口
WORD DstPort; // 目的端口
DWORD SeqNum; // 顺序号
DWORD AckNum; // 确认号
BYTE DataOff; // TCP头长
BYTE Flags; // 标志(URG、ACK等)
WORD Window; // 窗口大小
WORD Chksum; // 校验和
WORD UrgPtr; // 紧急指针
char data[100];
} TCP;struct vTCPHDR
{
   DWORD SrcAddr;
   DWORD DesAddr;
   char zero;
   char protocal;
   WORD length;
   struct _TCP tcp;
};
typedef struct _IP{
union{ BYTE Version; // 版本
BYTE HdrLen; // IHL
};
BYTE ServiceType; // 服务类型
WORD TotalLen; // 总长
WORD ID; // 标识
union{ WORD Flags; // 标志
WORD FragOff; // 分段偏移
};
BYTE TimeToLive; // 生命期
BYTE Protocol; // 协议
WORD HdrChksum; // 头校验和
DWORD SrcAddr; // 源地址
DWORD DstAddr; // 目的地址
} IP;  
     WORD checksum(WORD  *dpp, WORD length)
     {
         DWORD sum = 0;
          WORD len = length >> 1;
          WORD* dp=dpp;
         while(len-- > 0)
             sum += *dp++;
         if(length & 1)
             sum += (*dp & 0xFF00);         sum = (sum >> 16) + (sum & 0xFFFF);
         sum += (sum >> 16);
            
         len = sum & 0xFFFF;
         return(~len);
     }typedef struct  _DATA
{
struct _IP ip;
struct _TCP tcp;
}DATA;void InitData(DATA* data)
{
  memset(data->tcp.data,0,100);
  srand((unsigned)time(NULL));
  data->tcp.SeqNum=data->tcp.AckNum=rand();
  data->tcp.DataOff=5;
  data->tcp.Window=htons(2048);
  data->tcp.Flags=18;
  data->tcp.UrgPtr=0;
  data->tcp.Chksum=0;
  data->ip.HdrLen=0X45;
  data->ip.TotalLen=140;
  data->ip.ID=rand();
  data->ip.FragOff=0;
  data->ip.Protocol=6;
  data->ip.TimeToLive=127;
  data->ip.ServiceType=0;
  data->ip.HdrChksum=0;
 }void FinalData(DATA* data)
{
  vTCPHDR hdr;
  hdr.DesAddr=data->ip.DstAddr;
  hdr.SrcAddr=data->ip.SrcAddr;
  hdr.protocal=6;
  hdr.length=htons(20);
  hdr.tcp=data->tcp;
  data->tcp.Chksum=checksum((WORD*)&hdr,132);
  data->ip.HdrChksum=checksum((WORD*)&data->ip,20);
}SOCKET sck;// 用于应用程序“关于”菜单项的 CAboutDlg 对话框void send()
{
WSADATA WSAData;
BOOL flag=TRUE;
SOCKADDR_IN addr_in;
WSAStartup(MAKEWORD(2, 2), &WSAData);
sck = socket(AF_INET, SOCK_RAW, IPPROTO_RAW);
addr_in.sin_addr.S_un.S_addr =inet_addr("218.91.111.138"); //IP
addr_in.sin_family = AF_INET;
addr_in.sin_port = htons(80);
setsockopt(sck, IPPROTO_IP, IP_HDRINCL, (char*)&flag, sizeof(flag));
DATA buffer;
InitData(&buffer);
buffer.ip.DstAddr=inet_addr("218.91.111.138");
buffer.ip.SrcAddr=inet_addr("218.91.111.137");
buffer.tcp.DstPort=htons(80);
buffer.tcp.SrcPort=htons(1324);
memcpy(buffer.tcp.data,"您好!",100);
FinalData(&buffer);
char sbuffer[140];
memcpy(sbuffer,&buffer,140);
int k=sendto(sck,sbuffer,140,0,(struct sockaddr*)&addr_in,sizeof(struct sockaddr_in));
WSACleanup();}// 唯一的应用程序对象CWinApp theApp;using namespace std;int _tmain(int argc, TCHAR* argv[], TCHAR* envp[])
{
int nRetCode = 0; // 初始化 MFC 并在失败时显示错误
if (!AfxWinInit(::GetModuleHandle(NULL), NULL, ::GetCommandLine(), 0))
{
// TODO: 更改错误代码以符合您的需要
_tprintf(_T("致命错误:MFC 初始化失败\n"));
nRetCode = 1;
}
else
{
// TODO: 在此处为应用程序的行为编写代码。
send();
} return nRetCode;
}