关于ICMP数据接收问题
本人用RAW SOCKET编写的TRACERT程序,创建一个UDP原始SOCKET,发送一个UDP数据报,并且端口设置很大,以产生一个ICMP端口不可达差错报文,然后在创建一个ICMP原始SOCKET接受这个差错报文,但是总也接收不到,我用WSAGetLastError()函数扑获错误,错误代码是10022,不知道哪里出错了,我的接收代码是按PING程序的接收写的原码如下:
int main(int argc, char* argv[])
{
CreateWSASocket();
}
BOOL WINAPI CreateWSASocket()
{
......
//发送UDP数据报,并且发送成功!
}
//接收ICMP差错抱文
BOOL WINAPI RecvData()
{
//ICMP_HDR icmphdr;
//IP_HDR iphdr;
SOCKADDR_IN RemoteAddr;
INT byte = NULL,
TimeOut = 2000,
ErrCode = NULL,
USize = NULL,
TotalSize = NULL;
SOCKET ICMPSocket = NULL;
CHAR RecvData[MAX_LENGTH];
if(!InitWinSock())
return FALSE;
ICMPSocket=WSASocket(AF_INET,
SOCK_RAW,
IPPROTO_ICMP,
NULL,
0,
WSA_FLAG_OVERLAPPED);
if(ICMPSocket == INVALID_SOCKET)
{
printf("WSASocket failed!\n");
closesocket(ICMPSocket);
GetErrorCode();
}
// else
// printf("WSASocket success!\n");
ErrCode = setsockopt(ICMPSocket,SOL_SOCKET,SO_RCVTIMEO,(CHAR*) &TimeOut,sizeof(TimeOut));
if(ErrCode == SOCKET_ERROR)
{
printf("setsockopt failed!\n");
closesocket(ICMPSocket);
GetErrorCode();
}
else
printf("setsockopt success!\n");
USize = sizeof(RemoteAddr);
ZeroMemory(RecvData,sizeof(RecvData));
byte = recvfrom(ICMPSocket,RecvData,sizeof(RecvData),0,(LPSOCKADDR)&RemoteAddr,&USize);
if(byte == SOCKET_ERROR)
{
closesocket(ICMPSocket);
printf("recvfrom failed:%d\n" , WSAGetLastError());
if(WSAGetLastError() == WSAEINVAL)
{
printf("WSAEINVAL\n");
GetErrorCode();
}
}
else
printf("recvfrom byte = %d\n" , byte);
return TRUE;
}
请高手指教哪里出错了,并且正确的接收应该如何编写
问题点数:0、回复次数:2Top
1 楼c0der()回复于 2003-07-04 10:09:44 得分 0
开什么玩笑?发送ICMP 报文用UDP?有没有搞错.你连概念都没有搞清楚。
ICMP是网络层(IP层)的,UDP是传输层的。用UDP socket怎么能发送ICMP报文那?
不好意思,没有看代码。Top
2 楼c0der()回复于 2003-07-04 10:13:04 得分 0
给你一个例子吧:
http://www.vccode.com/file_show.php?id=1368Top



