发送数据包错误

feiyan125 2008-06-06 07:42:19
DWORD dwRet;
short nPort = *(short*) lpParam;
delete lpParam;
char srcIP[20];
IP_HEADER ipHeader;
TCP_HEADER tcpHeader;
PSD_HEADER psdHeader;
char szSendBuf[65000];
char recvBuffer[65000] ;//缓冲区存放捕获的数据
char FAR hostname[128];
struct hostent *phe;

gethostname(hostname,128);//获取本机主机名
phe = gethostbyname(hostname);//获取本机ip地址结构
strcpy(srcIP, inet_ntoa(*((struct in_addr *)phe->h_addr_list[0])));//得到本机ip地址

SOCKET sock = socket(AF_INET, SOCK_RAW, IPPROTO_TCP);
if(dwRet==SOCKET_ERROR)
{
AfxMessageBox("创建socket时失败!");
return dwRet;
}
else
{
unsigned long flag=1;
if ((ioctlsocket(sock, FIONBIO, &flag) != 0))
{
AfxMessageBox("未能改为非阻塞模式!");
dwRet = ERROR_MODIFY_FIONBIO;
}
else{
//设置发送/接受超时选项
dwRet=setsockopt(sock,SOL_SOCKET,SO_RCVTIMEO,(char*)&g_dwTimeOut,sizeof(g_dwTimeOut));
if(dwRet==SOCKET_ERROR)
{
AfxMessageBox("设置socket接收超时选项失败!");
return dwRet;
}
g_dwTimeOut=1000;
dwRet=setsockopt(sock,SOL_SOCKET,SO_SNDTIMEO,(char*)&g_dwTimeOut,sizeof(g_dwTimeOut));
if(dwRet==SOCKET_ERROR)
{
AfxMessageBox("设置socket发送超时选项失败!");
return dwRet;
}


sockaddr_in severAddr;
severAddr.sin_family = AF_INET;
severAddr.sin_port = htons(nPort);
severAddr.sin_addr.S_un.S_addr = g_ulAddr;

//填充IP首部
ipHeader.h_verlen = (4<<4 | sizeof(ipHeader)/sizeof(unsigned long));
// ipHeader.tos=0;
ipHeader.total_len = htons(sizeof(ipHeader)+sizeof(tcpHeader));
ipHeader.ident = 1;
ipHeader.frag_and_flags = 0x40;
ipHeader.ttl = 128;
ipHeader.proto = IPPROTO_TCP;
ipHeader.checksum = 0;
ipHeader.sourceIP = inet_addr(srcIP);//源IP
ipHeader.destIP = g_ulAddr;//目的IP


int optval=1;
//设置自己填充数据包
dwRet=setsockopt(sock,IPPROTO_IP,IP_HDRINCL,(char*)&optval,sizeof(optval));
if(dwRet==SOCKET_ERROR)
{
AfxMessageBox("Setsockopt IP_HDRINCL Error...\n");
return 0;
}




//填充TCP首部
tcpHeader.th_dport = htons(nPort);//目的端口
tcpHeader.th_sport = htons(0); //源端口
tcpHeader.th_seq = 0x12345678;
tcpHeader.th_ack = 0;
tcpHeader.th_lenres = (sizeof(tcpHeader)/4<<4|0);
tcpHeader.th_flag = 2;//syn标志位。0,2,4,8,16,32->FIN,SYN,RST,PSH,ACK,URG
tcpHeader.th_win = htons(512);
tcpHeader.th_urp = 0;
tcpHeader.th_sum = 0;

//填充tcp伪首部
psdHeader.saddr = ipHeader.sourceIP;
psdHeader.daddr = ipHeader.destIP;
psdHeader.mbz = 0;
psdHeader.ptcl = IPPROTO_TCP;
psdHeader.tcpl = htons(sizeof(tcpHeader));

//计算TCP校验和
memcpy(szSendBuf, &psdHeader, sizeof(psdHeader));
memcpy(szSendBuf + sizeof(psdHeader), &tcpHeader, sizeof(tcpHeader));
tcpHeader.th_sum = checksum((USHORT *)szSendBuf, sizeof(psdHeader) + sizeof(tcpHeader));

//计算IP检验和
memcpy(szSendBuf, &ipHeader, sizeof(ipHeader));
memcpy(szSendBuf + sizeof(ipHeader), &tcpHeader, sizeof(tcpHeader));
memset(szSendBuf + sizeof(ipHeader) + sizeof(tcpHeader), 0, 4);
ipHeader.checksum = checksum((USHORT *)szSendBuf, sizeof(ipHeader) + sizeof(tcpHeader));
memcpy(szSendBuf, &ipHeader, sizeof(ipHeader));
memcpy(szSendBuf + sizeof(ipHeader), &tcpHeader, sizeof(tcpHeader));

int flag=0;
connect(sock, (sockaddr*)&severAddr, sizeof(severAddr));
dwRet=send(sock,(char *)szSendBuf,sizeof(szSendBuf),flag);
//发送数据包
// dwRet = sendto(sock, szSendBuf, sizeof(ipHeader) + sizeof(tcpHeader), 0, (struct sockaddr*)&severAddr, sizeof(severAddr));
if(dwRet == SOCKET_ERROR)
{
AfxMessageBox("发送数据失败!");
return dwRet;
}


struct timeval timeout;
timeout.tv_sec = g_dwTimeOut / 1000;
timeout.tv_usec = g_dwTimeOut % 1000;


recv(sock,recvBuffer,sizeof(recvBuffer),0);


IP_HEADER *ipHeader_rec;//IP_HEADER型指针
TCP_HEADER *tcpHeader_rec;//TCP_HEADER型指针
ipHeader_rec = (IP_HEADER *)recvBuffer;
tcpHeader_rec = (TCP_HEADER *) (recvBuffer+sizeof(IP_HEADER));

if(tcpHeader_rec->th_flag == 18 && tcpHeader_rec->th_sport == htons(nPort))
{
dwRet=ERROR_SUCCESS;
}
else
dwRet=ERROR;
}

closesocket(sock);
}
g_nThreadCount=g_nThreadCount-1;
if (dwRet == ERROR_SUCCESS)
{
::SendMessage(g_hWnd, SCAN_THREAD, DOSCAN_FIND_PORT, nPort);
}
else
{
::SendMessage(g_hWnd, SCAN_THREAD, DOSCAN_END_PORT, nPort);
}
return dwRet;


}
程序编译的时候正确,执行的时候总出现发送数据包错误
...全文
1531 4 打赏 收藏 转发到动态 举报
写回复
用AI写文章
4 条回复
切换为时间正序
请发表友善的回复…
发表回复
feiyan125 2008-06-07
  • 打赏
  • 举报
回复
5555555555555
怎么没有人回复我!
feiyan125 2008-06-07
  • 打赏
  • 举报
回复
那个我改过来了!
如果设置IP_HDRINCL 选项,那么必须具有 administrator权限,要不就必须修改注册表
我们正常用的是什么级别的权限?
是不是一定要改成administrator权限才可以发送数据包
netcncom3 2008-06-07
  • 打赏
  • 举报
回复
char szSendBuf[65000];
char recvBuffer[65000] ;//缓冲区存放捕获的数据
char FAR hostname[128];

---------------
定义了这么大个缓冲区,有没有给他们初始化为零?
用memset(szSendbuf,0,65000)
或用ZeroMemory函数

你再用这个试试看。
tianyalangzizizi 2008-06-06
  • 打赏
  • 举报
回复
char szSendBuf[65000]是不是太大了?

18,356

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC 网络编程
c++c语言开发语言 技术论坛(原bbs)
社区管理员
  • 网络编程
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧