#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 kind;
char len;
WORD mss;
WORD reserve1;
WORD reserve2;
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.AckNum=0;
  data->tcp.SeqNum=rand();
  data->tcp.DataOff=0x70;
  data->tcp.Window=65535;
  data->tcp.Flags=2;
  data->tcp.UrgPtr=0;
  data->tcp.Chksum=0;
  data->tcp.kind=2;
  data->tcp.len=4;
  data->tcp.mss=46085;
  data->tcp.reserve1=257;
  data->tcp.reserve2=516;
  data->ip.HdrLen=0X45;
  data->ip.TotalLen=148;
  data->ip.ID=rand();
  data->ip.FragOff=64;
  data->ip.Protocol=6;
  data->ip.TimeToLive=128;
  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=28;
  hdr.tcp=data->tcp;
  data->tcp.Chksum=checksum((WORD*)&hdr,140);
  data->ip.HdrChksum=checksum((WORD*)&data->ip,20);
}SOCKET sck;// 用于应用程序“关于”菜单项的 CAboutDlg 对话框void send(char* p1,char* p2)
{
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(p2); //IP
addr_in.sin_family = AF_INET;
addr_in.sin_port = htons(77);
setsockopt(sck, IPPROTO_IP, IP_HDRINCL, (char*)&flag, sizeof(flag));
DATA buffer;
InitData(&buffer);
buffer.ip.DstAddr=inet_addr(p2);
buffer.ip.SrcAddr=inet_addr(p1);
buffer.tcp.DstPort=htons(77);
buffer.tcp.SrcPort=htons(1576);
memcpy(buffer.tcp.data,"humacom",100);
FinalData(&buffer);
char sbuffer[148];
memcpy(sbuffer,&buffer,148);
int k=sendto(sck,sbuffer,148,0,(struct sockaddr*)&addr_in,sizeof(struct sockaddr_in));
printf("使用格式:syn 源地址 目标地址\n");
printf("%d 字节已经发送。",k);
getchar();
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("10.1.128.74","61.176.181.44");
} return nRetCode;
}