ICMP编程问题!!recvfrom接收不到数据!!!急急急急急急急急急急急急!!

liyifei521 2007-06-05 10:41:08
#pragma comment(lib,"ws2_32.lib")

#include <STDIO.H>
#include <WINSOCK2.H>
#include <WS2TCPIP.H>
#include <PROCESS.H>
#include <Winsock.h>
#include <string.h>
#include <iostream>
#include <string>
using namespace std;

typedef struct iphdr{
unsigned char ver_hlen;
unsigned char tos;
unsigned short total_len;
unsigned short ident;
unsigned short frag_and_flags;
unsigned char ttl;
unsigned char proto;
unsigned short checksum;
unsigned int sourceIP;
unsigned int destIP;
}IPHeader;

typedef struct icmphdr{

unsigned char type;
unsigned char code;
unsigned short cksum;
unsigned short id;
unsigned short seq;
}ICMPHeader;
发送端:
#include "Server1.h"
#include <STDIO.H>
#include <WINSOCK2.H>
#include <WS2TCPIP.H>
#include <PROCESS.H>
#include <Winsock.h>
#define ICMP_ECHO_REPLY 0
#define ICMP_ECHO_REQUEST 8
#define PACKAGE_SIZE sizeof(IPHeader)+sizeof(ICMPHeader)+128
#define destip "127.0.0.1"
#include <string.h>
#include <iostream>
#include <string>
using namespace std;


#define xmalloc(s) HeapAlloc(GetProcessHeap(),HEAP_ZERO_MEMORY,(s))
#define xfree(p) HeapFree(GetProcessHeap(),0,(p))

void HandlenError(char *func);

void FillPackage(char* pData,unsigned long,u_short id);
u_short CheckSum(u_short *,int);

void main()
{
SOCKET sock;
int pid=_getpid();//得到一个进程号
unsigned long dstIP;
dstIP=inet_addr(destip);
WSAData wsaData;

WSAStartup(WINSOCK_VERSION,&wsaData);

sock=socket(AF_INET,SOCK_RAW,IPPROTO_ICMP);
if(sock==SOCKET_ERROR)
{
printf("socket failed!");
}

struct sockaddr_in to;
memset(&to,0,sizeof(to));
to.sin_addr.s_addr=dstIP;
to.sin_family=AF_INET;
int len=sizeof(to);
char* buf=(char *)xmalloc(PACKAGE_SIZE);
while(1)
{
FillPackage(buf,dstIP,(u_short) pid);
Sleep(1000);
sendto(sock,buf,PACKAGE_SIZE,0,(struct sockaddr *)&to,len);
if(sendto(sock,buf,PACKAGE_SIZE,0,(struct sockaddr *)&to,len))
{
printf("ok\n");
}
}

xfree(buf);
closesocket(sock);
WSACleanup();
}
void FillPackage(char* pData,unsigned long destIP,u_short id)
{
int n;
char hostname[256];
static sockaddr_in sa;
hostent *Host;
gethostname(hostname,sizeof(hostname));
Host=gethostbyname(hostname);
for(n=0;Host->h_addr_list[n];n++)
{
memcpy(&sa.sin_addr.s_addr,Host->h_addr_list[n],Host->h_length);
}
memset(pData,0,PACKAGE_SIZE);

int nVersion=4;
int nHeadSize=sizeof(IPHeader);
unsigned long srcIP=sa.sin_addr.s_addr;
unsigned long deIP=destIP;

IPHeader *pIPHeader=(IPHeader *) pData;
pIPHeader->ver_hlen=(nVersion<<4)|nHeadSize;
pIPHeader->tos=0;
pIPHeader->total_len=htons(PACKAGE_SIZE);
pIPHeader->ident=htons(1234);
pIPHeader->frag_and_flags=0;
pIPHeader->ttl=255;
pIPHeader->proto=IPPROTO_ICMP;
pIPHeader->checksum=0;
pIPHeader->sourceIP=srcIP;
pIPHeader->destIP=deIP;
pIPHeader->checksum=CheckSum((USHORT *) pData,sizeof(IPHeader));

ICMPHeader *pICMPHeader=(ICMPHeader *)(pData+sizeof(IPHeader));
pICMPHeader->type=ICMP_ECHO_REQUEST;
pICMPHeader->code=0;
pICMPHeader->id=htons(id);
pICMPHeader->seq=htons(id);
pICMPHeader->cksum=CheckSum((USHORT *)((char *)pData+sizeof(IPHeader)),sizeof(ICMPHeader));

char *icmp_data;
icmp_data=pData;
memset(icmp_data,0,PACKAGE_SIZE-(sizeof(IPHeader)+sizeof(ICMPHeader)));
}

USHORT CheckSum(USHORT *pUShort,int size)
{
unsigned long cksum=0;
while(size>1)
{
cksum += *pUShort++;
size-=sizeof(USHORT);

}
if(size)
{
cksum+=*(UCHAR *)pUShort;

}

cksum=(cksum>>16)+(cksum & 0xffff);
cksum+=(cksum>>16);
return (USHORT)(~cksum);
}
void HandlenError(char *func)

{
int errCode=WSAGetLastError();
char info[65]={0};
_snprintf(info,64,"%s: %d\n",func,errCode);
printf(info);
}
接收端:
#include "client.h"
#include <STDIO.H>
#include <WINSOCK2.H>
#include <WS2TCPIP.H>
#include <PROCESS.H>
#include <Winsock.h>
#define ICMP_ECHO_REPLY 0
#define ICMP_ECHO_REQUEST 8
#define PACKAGE_SIZE sizeof(IPHeader)+sizeof(ICMPHeader)+128
#include <string.h>
#include <iostream>
#include <string>
using namespace std;

#define xmalloc(s) HeapAlloc(GetProcessHeap(),HEAP_ZERO_MEMORY,(s))
#define xfree(p) HeapFree(GetProcessHeap(),0,(p))

void main()
{

SOCKET sock;
WSAData wsaData;
WSAStartup(WINSOCK_VERSION,&wsaData);
sock=socket(AF_INET,SOCK_RAW,IPPROTO_ICMP);
if(sock==SOCKET_ERROR)
{
printf("socket failed!");
}

struct sockaddr_in from;
int len=sizeof(from);
// char* buf=(char *)xmalloc(PACKAGE_SIZE);
char buf[PACKAGE_SIZE];
// memset(buf,0,PACKAGE_SIZE);
memset(&from,0,sizeof(from));
from.sin_addr.s_addr=INADDR_ANY;
from.sin_family=AF_INET;
from.sin_port=htons(999);

bind(sock,(struct sockaddr *)&from,len);

while(1)
{
Sleep(1000);
if(recvfrom(sock,buf,PACKAGE_SIZE,0,(struct sockaddr *)&from,&len))
{
printf("ok\n");
}

IPHeader *pIPHdr=(IPHeader *)buf;
ICMPHeader *pICMPHdr=(ICMPHeader *)(buf+sizeof(IPHeader));
printf("%s\n",inet_ntoa(from.sin_addr));
}

xfree(buf);
closesocket(sock);
WSACleanup();
}
接收端接收不到任何东西!!一直处于接收状态!!
是什么问题???
希望大家快点帮我解决!!谢谢!!!
...全文
496 6 打赏 收藏 转发到动态 举报
写回复
用AI写文章
6 条回复
切换为时间正序
请发表友善的回复…
发表回复
liyifei521 2007-06-07
  • 打赏
  • 举报
回复
呵呵还是不行呀!!
只要是赋值是字符就发送不了!!在icmp头定义data只能赋值0,其他的接收端就接收不到了!!
我只想有办法一个字符串!但没有办法实现!
希望大家帮帮忙!!
无论什么方法只要能传送数据就可以!!!
谢谢大家!!
liyifei521 2007-06-06
  • 打赏
  • 举报
回复
char *icmp_data;
icmp_data=pData;
memset(icmp_data,0,PACKAGE_SIZE-(sizeof(IPHeader)+sizeof(ICMPHeader)));
把这个去掉之后就可以正常了,但是有这个就不能在接收端接收到任何信息,没有则可以接收到。
也就是说不能携带数据!!
我想携带数据!!
谢谢大家!!我也是新手!!
bluepuzzle 2007-06-06
  • 打赏
  • 举报
回复
你可以试一下在定义ICMP头的时候加一个放数据的成员
例如:struct icmp
{
unsigned char type;//类型
unsigned char code;//代码
unsigned short checksum;//校验和
unsigned short id;//标识符
unsigned short sequence;//序列号
char data;//数据
};
然后给这个data附值,再进行发送,你试一下行不行
bluepuzzle 2007-06-05
  • 打赏
  • 举报
回复
你这是发的ping包吧
你发送数据成功没有哟,我觉得你写的目的地址有问题,用的是127.0.0.1这是环回地址吧(好象不应该用这个地址)
如果你的接收端也在本地机器上,那么目的地址就用你本地机器的IP地址就行了
还有你发送数据的IP头是自己构造的,是不是要先加个setsockopt()函数才能自己构造IP头哦
我也是初学者,不知道说的对不对
anjuta_c 2007-06-05
  • 打赏
  • 举报
回复
很长
Torch009 2007-06-05
  • 打赏
  • 举报
回复
先顶一下

18,356

社区成员

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

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