解决方案 »
- windows 2000下的服务中获取系统的登录、注销事件
- 高手帮忙:谁能提供CAsyncSocket类写的通讯例子,谢谢!
- OLE开发问题,都帮忙解决的话再开500分贴答谢。
- 为什么不能从资源中读出字符串?
- 如何使用tab控件!
- 不能向表中添加行,是怎么回事?
- 各位弟兄,我终于解脱了!最近都在做些什么?很想念你们
- sock编程中 fd_set 这个是什么类型?
- 关于CListCtrl 的属性LVS_NOSORTHEADER
- 如何拆分由空格连接的两个字符串字符串(CString)??
- 使用MsComm控件,如何使得一次OnComm事件中能够收到大于8个字节的内容?
- VC 6.0中如何添加自己定义的消息
[email protected]
[email protected]
MSN: [email protected]
看一下具体的错误信息.
看一下具体的错误信息.
这个不会我是菜鸟,那个程序也是照着写的
发送很简单,定义原始套接字发送,定义一个BUF,按TCP或UDP的包结构把数据填进去,然后发送。
TCPPacketHead tcp_header;
PSD_HEADER psd_header;
char SendBuf[100]={0};
sockaddr_in dest;
memset(&dest,0,sizeof(dest));
dest.sin_family = AF_INET;
dest.sin_port = pTCPHead->SourPort;
dest.sin_addr.s_addr=pIpHeader->sourceIP;
//填充IP首部
ip_header.version=4;
ip_header.header_len=sizeof(ip_header)/sizeof(unsigned long);
//高四位IP版本号,低四位首部长度
ip_header.total_len=htons(sizeof(ip_header)+sizeof(tcp_header)); //16位总长度(字节)
ip_header.ident=1; //16位标识
ip_header.flags=0; //3位标志位
ip_header.ttl=128; //8位生存时间TTL
ip_header.proto=IPPROTO_TCP; //8位协议(TCP,UDP…)
ip_header.checksum=0; //16位IP首部校验和
ip_header.sourceIP=pIpHeader->destIP; //32位源IP地址
ip_header.destIP=pIpHeader->sourceIP; //32位目的IP地址 //填充TCP首部
tcp_header.SourPort=pTCPHead->DestPort; //源端口号
tcp_header.DestPort=pTCPHead->SourPort; //目的端口号
tcp_header.SeqNo=pTCPHead->AckNo; //SYN序列号
tcp_header.AckNo=htonl(ntohl(pTCPHead->SeqNo)+1); //ACK序列号置为0
tcp_header.HLen=(sizeof(TCPPacketHead)/4<<4|0); //TCP长度和保留位
tcp_header.Flag=4; //RST 标志
tcp_header.WndSize=htons(16384); //窗口大小
tcp_header.UrgPtr=0; //偏移
tcp_header.ChkSum=0; //校验和
//填充TCP伪首部(用于计算校验和,并不真正发送)
psd_header.saddr=ip_header.sourceIP;
psd_header.daddr=ip_header.destIP;
psd_header.mbz=0;
psd_header.ptcl=IPPROTO_TCP;
psd_header.tcpl=htons(sizeof(tcp_header));
//计算TCP校验和,计算校验和时需要包括TCP pseudo header
memcpy(SendBuf,&psd_header,sizeof(psd_header));
memcpy(SendBuf+sizeof(psd_header),&tcp_header,sizeof(tcp_header));
tcp_header.ChkSum=CIpmonDlg:: checksum((USHORT *)SendBuf,sizeof(psd_header)+sizeof(tcp_header));
//计算IP校验和
memcpy(SendBuf,&ip_header,sizeof(ip_header));
memcpy(SendBuf+sizeof(ip_header),&tcp_header,sizeof(tcp_header));
memset(SendBuf+sizeof(ip_header)+sizeof(tcp_header),0,4);
ip_header.checksum=CIpmonDlg::checksum((USHORT *)SendBuf,sizeof(ip_header)+sizeof(tcp_header)); //填充发送缓冲区
memcpy(SendBuf,&ip_header,sizeof(ip_header)); //发送TCP报文
int bbb=sendto(pDlg->m_s,SendBuf,sizeof(ip_header)+sizeof(tcp_header),0,(struct sockaddr*) &dest, sizeof(dest));
if(bbb=SOCKET_ERROR)
{AfxMessageBox("1aaaa111");}
//delete []SendBuf;
DWORD retError = GetLastError(void);放在哪里?
我是传说中术士:)