请教原始IP套接口编程!

moncat 2003-09-16 02:14:29
本人尝试用原始IP套接口在windows下写程序,但是总是不能正常运行
做嗅探器又做不了,无法接收;做自己构造IP包,又发送出现10049错误,不知怎么回事,请这方面的高手指点,有现成的例子最好!谢谢,我已经搞了很久了,都没搞成
...全文
31 26 打赏 收藏 转发到动态 举报
写回复
用AI写文章
26 条回复
切换为时间正序
请发表友善的回复…
发表回复
net205 2003-09-23
  • 打赏
  • 举报
回复
我要学习
kxbkxb2000@163.com
ljlln 2003-09-23
  • 打赏
  • 举报
回复
学习中...
望:netsys2(来电)能给一份!谢谢
mylnemail@163.com
hantao 2003-09-23
  • 打赏
  • 举报
回复
学习
moncat 2003-09-23
  • 打赏
  • 举报
回复
怎么就没人回答了呀?
快帮帮忙啊,他老是出现发送错误(10049)
COKING 2003-09-22
  • 打赏
  • 举报
回复
呵呵。。。
moncat 2003-09-22
  • 打赏
  • 举报
回复
to COKING(疯间猖越) :
不会吧?
UDP的校验和是用伪首部的啊,源目IP地址+UDP+数据
IP的校验和是不含数据的

你还是去查下tcp/ip协议吧
COKING 2003-09-22
  • 打赏
  • 举报
回复
你两个CheckSum是错的!

UDP的CheckSum是:UDP头+数据

IP的CheckSum是: IP头 + UDP头+ 数据
moncat 2003-09-22
  • 打赏
  • 举报
回复
大哥,我的IP包里面的是UDP包啊,当然要指示UDP啦,要不接收端系统如何解析我的数据包内容啊?
kingcaiyao 2003-09-20
  • 打赏
  • 举报
回复
//构造IP首部
memset(&iph,0,sizeof(IPHeader));
iph.h_lenver = (4<<4)|sizeof(IPHeader)/sizeof(unsigned long);
iph.total_len = htons(pkgsize);
iph.ttl = 128;
iph.proto = IPPROTO_UDP;//这里既然是构造IP首部,为何要用的是UDP协议啊?
iph.checksum = 0;
iph.sourceIP = inet_addr("192.168.0.1");
iph.destIP = inet_addr("192.168.0.1");
iph.checksum = CheckSum((unsigned short*)&iph,sizeof(IPHeader));
netsys2 2003-09-19
  • 打赏
  • 举报
回复
都发了,查收
moncat 2003-09-19
  • 打赏
  • 举报
回复
嗅探器已经解决了,自组IP包的还不行,总是出现错误
moncat 2003-09-19
  • 打赏
  • 举报
回复
to netsys2(来电):
谢谢你,我的电子邮箱:liu_fq@163.com 或 liu_fq@mail.china.com
moncat 2003-09-19
  • 打赏
  • 举报
回复
不好意思,第一次发的上面的 //构造TCP首部 改为 //构造IP首部
moncat 2003-09-19
  • 打赏
  • 举报
回复
to: netsys2(来电),谢谢了,但是就是不行,发送老是出现10049错误
我写的源代码贴出来给大家看看,麻烦检查一下:

int main(int argc, char* argv[])
{
char SendBuf[512] = {0};
WSADATA wsaData;
SOCKET SockRaw;
sockaddr_in addr;

if(WSAStartup(MAKEWORD(2,1),&wsaData))
{
printf("WSAStartup() error: %d\n",WSAGetLastError());
return -1;
}

memset(&addr,0,sizeof(addr));
addr.sin_family = AF_INET;
addr.sin_addr.s_addr = inet_addr("192.168.0.1");
addr.sin_port = htons(9000);

SockRaw = socket(AF_INET , SOCK_RAW , IPPROTO_IP);
if(SockRaw==INVALID_SOCKET)
{
printf("socket() error: %d\n",WSAGetLastError());
return -1;
}

int bOpt = 1;
if(setsockopt(SockRaw, IPPROTO_IP, IP_HDRINCL,(char*) &bOpt, sizeof(int))==SOCKET_ERROR)
{
printf("setsockopt() error: %d\n",WSAGetLastError());
return -1;
}

////////////////////////////////////////
IPHeader iph;
UDPHeader udph;
PSD_UDPHeader *pudph = (PSD_UDPHeader *)SendBuf;
char *p;
char msg[]="这是一个测试包";
unsigned short udpsize,pudpsize,pkgsize;

udpsize = sizeof(UDPHeader) + strlen(msg);
pkgsize = sizeof(IPHeader) + udpsize;

//构造IP首部
memset(&iph,0,sizeof(IPHeader));
iph.h_lenver = (4<<4)|sizeof(IPHeader)/sizeof(unsigned long);
iph.total_len = htons(pkgsize);
iph.ttl = 128;
iph.proto = IPPROTO_UDP;
iph.checksum = 0;
iph.sourceIP = inet_addr("192.168.0.1");
iph.destIP = inet_addr("192.168.0.1");
iph.checksum = CheckSum((unsigned short*)&iph,sizeof(IPHeader));

//构造UDP首部
memset(&udph,0,sizeof(UDPHeader));
udph.uh_sport = htons(9000);
udph.uh_dport = htons(9000);
udph.uh_len = htons(udpsize);
udph.uh_sum = 0;

//构造udp伪首部
pudpsize = 0;
p = (char*)pudph->udpdata;
pudph->saddr = inet_addr("192.168.0.1");
pudph->daddr = inet_addr("192.168.0.1");
pudph->mbz = 0;
pudph->protocol = IPPROTO_UDP;
pudph->udplen = htons(udpsize);
pudph->udph = udph;
pudpsize = p - SendBuf ;
strcpy(pudph->udpdata,msg);
pudpsize += strlen(msg);

//计算UDP检验和
memset(SendBuf,0,512);
udph.uh_sum = CheckSum((unsigned short*)SendBuf,pudpsize);

//填充发送缓冲区
memset(SendBuf,0,512);
pkgsize = 0;
memcpy(SendBuf,&iph,sizeof(iph));
pkgsize += sizeof(iph);
memcpy(SendBuf+pkgsize,&udph,sizeof(udph));
pkgsize += sizeof(udph);
memcpy(SendBuf+pkgsize,msg,strlen(msg));
pkgsize += strlen(msg);

///////////////////////////////////////
if(sendto(SockRaw,SendBuf,pkgsize,0,(sockaddr*)&addr,sizeof(addr))==SOCKET_ERROR)
{
printf("sendto() error: %d\n",WSAGetLastError());
return -1;
}

closesocket(SockRaw);
WSACleanup();
return 0;
}
moncat 2003-09-19
  • 打赏
  • 举报
回复
to: netsys2(来电),谢谢了,但是就是不行,发送老是出现10049错误
我写的源代码贴出来给大家看看,麻烦检查一下:

int main(int argc, char* argv[])
{
char SendBuf[512] = {0};
WSADATA wsaData;
SOCKET SockRaw;
sockaddr_in addr;

if(WSAStartup(MAKEWORD(2,1),&wsaData))
{
printf("WSAStartup() error: %d\n",WSAGetLastError());
return -1;
}

memset(&addr,0,sizeof(addr));
addr.sin_family = AF_INET;
addr.sin_addr.s_addr = inet_addr("192.168.0.1");
addr.sin_port = htons(9000);

SockRaw = socket(AF_INET , SOCK_RAW , IPPROTO_IP);
if(SockRaw==INVALID_SOCKET)
{
printf("socket() error: %d\n",WSAGetLastError());
return -1;
}

int bOpt = 1;
if(setsockopt(SockRaw, IPPROTO_IP, IP_HDRINCL,(char*) &bOpt, sizeof(int))==SOCKET_ERROR)
{
printf("setsockopt() error: %d\n",WSAGetLastError());
return -1;
}

////////////////////////////////////////
IPHeader iph;
UDPHeader udph;
PSD_UDPHeader *pudph = (PSD_UDPHeader *)SendBuf;
char *p;
char msg[]="这是一个测试包";
unsigned short udpsize,pudpsize,pkgsize;

udpsize = sizeof(UDPHeader) + strlen(msg);
pkgsize = sizeof(IPHeader) + udpsize;

//构造TCP首部
memset(&iph,0,sizeof(IPHeader));
iph.h_lenver = (4<<4)|sizeof(IPHeader)/sizeof(unsigned long);
iph.total_len = htons(pkgsize);
iph.ttl = 128;
iph.proto = IPPROTO_UDP;
iph.checksum = 0;
iph.sourceIP = inet_addr("192.168.0.1");
iph.destIP = inet_addr("192.168.0.1");
iph.checksum = CheckSum((unsigned short*)&iph,sizeof(IPHeader));

//构造UDP首部
memset(&udph,0,sizeof(UDPHeader));
udph.uh_sport = htons(9000);
udph.uh_dport = htons(9000);
udph.uh_len = htons(udpsize);
udph.uh_sum = 0;

//构造udp伪首部
pudpsize = 0;
p = (char*)pudph->udpdata;
pudph->saddr = inet_addr("192.168.0.1");
pudph->daddr = inet_addr("192.168.0.1");
pudph->mbz = 0;
pudph->protocol = IPPROTO_UDP;
pudph->udplen = htons(udpsize);
pudph->udph = udph;
pudpsize = p - SendBuf ;
strcpy(pudph->udpdata,msg);
pudpsize += strlen(msg);

//计算UDP检验和
memset(SendBuf,0,512);
udph.uh_sum = CheckSum((unsigned short*)SendBuf,pudpsize);

//填充发送缓冲区
memset(SendBuf,0,512);
pkgsize = 0;
memcpy(SendBuf,&iph,sizeof(iph));
pkgsize += sizeof(iph);
memcpy(SendBuf+pkgsize,&udph,sizeof(udph));
pkgsize += sizeof(udph);
memcpy(SendBuf+pkgsize,msg,strlen(msg));
pkgsize += strlen(msg);

///////////////////////////////////////
if(sendto(SockRaw,SendBuf,pkgsize,0,(sockaddr*)&addr,sizeof(addr))==SOCKET_ERROR)
{
printf("sendto() error: %d\n",WSAGetLastError());
return -1;
}

closesocket(SockRaw);
WSACleanup();
return 0;
}
ysyzqm-zqm 2003-09-19
  • 打赏
  • 举报
回复
我也要:(
zqm@mail.cc163.com
netsys2 2003-09-18
  • 打赏
  • 举报
回复
楼主还没有留妹,再等2天
netsys2 2003-09-18
  • 打赏
  • 举报
回复
楼主还没有留妹,再等2天
tanbi52 2003-09-18
  • 打赏
  • 举报
回复
代理服务哭没有设置好
newcoco800927 2003-09-18
  • 打赏
  • 举报
回复
netsys2(来电):

我也要,my mail: Coer_New@Dlink.com.cn
加载更多回复(6)

1,317

社区成员

发帖
与我相关
我的任务
社区描述
C++ Builder 网络及通讯开发
社区管理员
  • 网络及通讯开发社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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