Raw Socket发送自定义IP/TCP包问题

wangyuecl 2007-01-12 07:13:57
各位好:
我在学原始套接字发送自定义IP包时遇到了困难,希望大家帮助我,我的按照人家的代码写:
WSAData wsaData;
if(WSAStartup(MAKEWORD(2, 2), &wsaData) != 0) //winsock初始化
{
TRACE("winsock初始化失败!\n");
return 1;
}

if ((sock = WSASocket(AF_INET, SOCK_RAW, IPPROTO_RAW, NULL, 0,
WSA_FLAG_OVERLAPPED)) == INVALID_SOCKET)
{
TRACE("建立socket失败!\n");
return false;
}

BOOL flag=true;
if (setsockopt(sock, IPPROTO_IP, IP_HDRINCL, (char*) &flag, sizeof(flag)) ==SOCKET_ERROR)
{
TRACE("setsockopt IP_HDRINCL error!\n");
return false;
}

int nTimeOver = 1000;
if(setsockopt(sock, SOL_SOCKET, SO_SNDTIMEO, (char*) &nTimeOver, sizeof(nTimeOver)) == SOCKET_ERROR)
{
TRACE("setsockopt SO_SNDTIMEO error!\n");
return false;
}

SOCKADDR_IN addr_in;
addr_in.sin_family = AF_INET;
addr_in.sin_port = htons(m_Port);
addr_in.sin_addr.S_un.S_addr = inet_addr(m_strIP);

TRACE("ip为:%s, 端口号为:%d\n", m_strIP, m_Port);
//填充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 = 0;
ipHeader.ttl = 128;
ipHeader.proto = IPPROTO_TCP;
ipHeader.checksum = 0;
ipHeader.sourceIP = inet_addr("localhost");
ipHeader.destIP = inet_addr(m_strIP);

//填充TCP报头
tcpHeader.th_dport = htons(m_Port);
tcpHeader.th_sport = htons(m_Port); //源端口号
tcpHeader.th_seq = htonl(0x12345678);
tcpHeader.th_ack = 0;
tcpHeader.th_lenres = (sizeof(tcpHeader) / 4 << 4 | 0);
tcpHeader.th_flag = 2; //标志位探测,2是SYN
tcpHeader.th_win = htons(512);
tcpHeader.th_urp = 0;
tcpHeader.th_sum = 0;

psdHeader.saddr = ipHeader.sourceIP;
psdHeader.daddr = ipHeader.destIP;
psdHeader.mbz = 0;
psdHeader.ptcl = IPPROTO_TCP;
psdHeader.tcpl = htons(sizeof(tcpHeader));


// AfxBeginThread(ThreadFunction, 0);

char szSendBuf[MAX_LEN] = { 0 };
memcpy(szSendBuf, &psdHeader, sizeof(psdHeader));
memcpy(szSendBuf + sizeof(psdHeader), &tcpHeader, sizeof(tcpHeader));

tcpHeader.th_sum = checksum((unsigned short*)szSendBuf,
sizeof(psdHeader) + sizeof(tcpHeader));

memcpy(szSendBuf, &ipHeader, sizeof(ipHeader));
memcpy(szSendBuf + sizeof(ipHeader), &tcpHeader, sizeof(tcpHeader));
memset(szSendBuf + sizeof(ipHeader) + sizeof(tcpHeader), 0, 4);

ipHeader.checksum = checksum((unsigned short*)szSendBuf,
sizeof(ipHeader) + sizeof(tcpHeader));

memcpy(szSendBuf, &ipHeader, sizeof(ipHeader));

int rect;
rect = sendto(sock, szSendBuf,
sizeof(ipHeader) + sizeof(tcpHeader),
0,(struct sockaddr*) &addr_in,
sizeof(addr_in));

if (rect == SOCKET_ERROR)
{
TRACE("send error!:%d\n", WSAGetLastError());
return false;
}
else
printf("send ok!\n");


closesocket(sock);
WSACleanup();
但是总是运行到TRACE("send error!:%d\n", WSAGetLastError());,错误码为10004,函数调用中断。该错误表明由于对WSACancelBlockingCall的调用,造成了一次调用被强行中断。我不知道原因出在何处,希望各位赐教,谢谢!
...全文
884 10 打赏 收藏 转发到动态 举报
写回复
用AI写文章
10 条回复
切换为时间正序
请发表友善的回复…
发表回复
nuaa_maliang 2008-08-28
  • 打赏
  • 举报
回复
好像在管理员权限下还是可以滴……。
WYMSCORPIO 2008-07-25
  • 打赏
  • 举报
回复
不知道楼主最后是怎么解决的!换到其他操作系统上了,还是......
WYMSCORPIO 2008-07-25
  • 打赏
  • 举报
回复
哇! 搜过相关问题,原来是通信开发包自身问题! 现在才看到这个帖子,惭愧啊!我也苦于这个问题,都从来没做过不知道啊!现在才知道了!害苦我了!
RedAngel001 2007-01-28
  • 打赏
  • 举报
回复
winXp+sp后可以用winpcap实现.
yishow 2007-01-26
  • 打赏
  • 举报
回复
楼上说得对,我也曾经苦于这个问题很久,最终还是只能在2000下做这件事情
xijia_130 2007-01-26
  • 打赏
  • 举报
回复
XP+SP2禁止使用raw 发送tcp包的
WingForce 2007-01-12
  • 打赏
  • 举报
回复
改为使用winsock2.h试试
wangyuecl 2007-01-12
  • 打赏
  • 举报
回复
我刚才在win2000下发送,没有这样的错误发生,为什么在XP下就不可以,如果想在XP下运行,又怎么解决?
wangyuecl 2007-01-12
  • 打赏
  • 举报
回复
试过了,还是同样的结果
WingForce 2007-01-12
  • 打赏
  • 举报
回复
把防火墙关掉试试

18,357

社区成员

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

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