社区
网络及通讯开发
帖子详情
请教原始IP套接口编程!
moncat
2003-09-16 02:14:29
本人尝试用原始IP套接口在windows下写程序,但是总是不能正常运行
做嗅探器又做不了,无法接收;做自己构造IP包,又发送出现10049错误,不知怎么回事,请这方面的高手指点,有现成的例子最好!谢谢,我已经搞了很久了,都没搞成
...全文
26
26
打赏
收藏
请教原始IP套接口编程!
本人尝试用原始IP套接口在windows下写程序,但是总是不能正常运行 做嗅探器又做不了,无法接收;做自己构造IP包,又发送出现10049错误,不知怎么回事,请这方面的高手指点,有现成的例子最好!谢谢,我已经搞了很久了,都没搞成
复制链接
扫一扫
分享
转发到动态
举报
写回复
配置赞助广告
用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)
Socket
编程
系列之2:Windows-API网络
编程
入门实战
Socket
编程
系列初步计划:Socket
编程
系列之1: Linux-API 网络
编程
入门实战Socket
编程
系列之2: Windows-API 网络
编程
入门实战Socket
编程
系列之3: Muduo 网络
编程
入门实战Socket
编程
系列之4: Libevent 网络
编程
入门实战Socket
编程
系列之5: Libcurl 网络
编程
入门实战Socket
编程
系列之6: Boost-ASIO 网络
编程
入门实战----------------------------------------------------Socket
编程
系列之2:Windows-API网络
编程
入门实战l Winsock
编程
接口
l UDP程序设计l TCP
套
接口
函数l Web客户/服务器程序l 基于windows的IO复用机制l UDP广播和多播l
套
接字选项l Windows
套
接字I/O模型l
原始
套
接字与ICMPl WinInet简介与案例实战
原始
套
接口
的ping命令
编程
原始
套
接口
(SOCK_RAW)允许对较低层协议(如
IP
或ICMP)进行直接访问,常用于检验新的网络协议实现,也可用于测试新配置或安装的网络设备。创建一个
原始
套
接口
时,一般格式如下: SOCKET sockid=socket(AF_INET,SOCK_RAW,
IP
PROTO_I
UNIX网络
编程
读书笔记:简介
认知
套
接口
编程
接口
理解
原始
套
接口
(raw socket)的概念 值得注意的是,客户和服务器是典型的用户进程,而TCP和
IP
协议则通常是系统内核协议栈的一部分。 上图中在TCP和UDP之间留有间隙,用于指出应用程序可以绕过传输层而直接使用
IP
v4和
IP
v6,这称为
原始
套
接口
(raw socket)。 UNIX网络
编程
中所说的
套
接口
编程
接口
是应用层到传输层的
接口
。UNIX网...
Linux Socket
编程
实战第1季第1部分
课程特点: 1、手把手的实际操作过程;2、引导学员一步步去思考;3、网络技术方面初级的一步步进入linux socket
编程
的世界;本课程是linux socket
编程
的一小部分,从无名
套
接口
开始,然后逐步深入,这应该是很多课程所没有的。以通俗的比照讲清楚一些概念,更多的是如何一步步通过代码去实现,并辅之以一些小的项目来更好的理解linux socket
编程
的技巧和方法。
网络及通讯开发
1,314
社区成员
8,874
社区内容
发帖
与我相关
我的任务
网络及通讯开发
C++ Builder 网络及通讯开发
复制链接
扫一扫
分享
社区描述
C++ Builder 网络及通讯开发
社区管理员
加入社区
获取链接或二维码
近7日
近30日
至今
加载中
查看更多榜单
社区公告
暂无公告
试试用AI创作助手写篇文章吧
+ 用AI写文章