Raw Socket发送自定义IP/TCP包问题
各位好:
我在学原始套接字发送自定义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的调用,造成了一次调用被强行中断。我不知道原因出在何处,希望各位赐教,谢谢!