高手请进,tcp/ip的问题 200高分相送 不够再来!急
接受网络里面所有的请求,并给于每个请求返回三个unreach,两个rst。目的是中断请求。
以下是我的程序代码,(其中运行时在ret=setsockopt(shoe,IPPROTO_IP,IP_HDRINCL,(char*)&bOpt,sizeof(bOpt));处报错):
头文件 struct.h
/*struct.h*/
struct iphdr //ip头
{
int version; //版本号
int ihl; //头长度
unsigned char tos;//服务类型
unsigned short tot_len;//总长
unsigned short id;//序号
unsigned short frag_off;//标志
unsigned char ttl;//寿命
unsigned char protocol;//协议
unsigned short check;//校验
unsigned int saddr;//源地址
unsigned int daddr;//目的地址
};
///////////////////////////////////////////
struct tcphdr//tcp头结构
{
unsigned short source;//源地址
unsigned short dest;//目的地址
unsigned char seq;
unsigned short ack_seq;
unsigned short doff;
bool res1;
bool res2;
bool urg;
bool ack;
bool psh;
bool rst;
bool syn;
bool fin;
unsigned long window;
unsigned short check;
int urg_ptr;
};
////////////////////////////////////////////
struct icmphdr//icmp头结构
{
int type;
int code;
unsigned short icmpchecksum;
};
cpp文件:
// test0.cpp : Defines the entry point for the console application.
#include "stdafx.h"
#include <winsock2.h>
#include <stdlib.h>
#include <stdio.h>
#include <windows.h>
#include "struct.h"
#include <winbase.h>
#include <WS2TCPIP.h>
void reset(struct iphdr *,struct tcphdr *,int);
void unreach(unsigned int,struct iphdr *,struct icmphdr *,int);
void main()
{
bool response_flag;
SOCKET shoe;
bool bOpt;
int i;
int ret;
char *buffer;
WSADATA wsaData;
if(WSAStartup(MAKEWORD(2,2),&wsaData)!=0)//使用winsock2.2
{
printf("WSAStartup() failed:%d\n",WSAGetLastError());
return ;
}
shoe=WSASocket(AF_INET, SOCK_RAW, IPPROTO_TCP, NULL, 0,0);
if(shoe==INVALID_SOCKET)
{
printf("WSASocket() failed: %d\n",WSAGetLastError());
return;
}
bOpt=TRUE;
ret=setsockopt(shoe,IPPROTO_IP,IP_HDRINCL,(char*)&bOpt,sizeof(bOpt));//此处报错
if(ret==SOCKET_ERROR)
{
printf("setsockopt(IP_HDRINCL) failed:%d\n",WSAGetLastError());
return;
}
struct epack
{
struct iphdr ip;
struct tcphdr tcp;
struct icmphdr icmp;
}epack;
buffer=(char*)malloc(sizeof(epack));
int dlen;
struct sockaddr dest;
struct iphdr *iphp;
struct tcphdr *tcphp;
struct icmphdr *icmphp;
iphp=(struct iphdr *)(((unsigned long)&epack.ip)-2);
tcphp=(struct tcphdr *)(((unsigned long)&epack.tcp)-2);
icmphp=(struct icmphdr *)(((unsigned long)&epack.icmp)-2);
while(1)
{
if(recvfrom(shoe,buffer,sizeof(epack),0,&dest,&dlen))
response_flag=1;
if(response_flag)
{
unreach(0,iphp,icmphp,shoe);//返回网络不可得
unreach(1,iphp,icmphp,shoe); //主机不可得
unreach(3,iphp,icmphp,shoe);//端口不可得
for(i=0;i<2;i++)
reset(iphp,tcphp,shoe);//返回rst
}
}
}
void reset(struct iphdr *iphp,struct tcphdr *tcphp,int shoe)
{
char* sendbuffer;
void dump(struct iphdr *,struct tcphdr *);
struct tpack
{
struct iphdr ip;
struct tcphdr tcp;
}tpack;
struct pseudo_header{
unsigned source_address;
unsigned dest_address;
unsigned char placeholder;
unsigned char protocol;
unsigned short tcp_length;
struct tcphdr tcp;
}pheader;
struct sockaddr_in sin;
sin.sin_family=AF_INET;
sin.sin_port=tcphp->dest;
sin.sin_addr.s_addr=iphp->saddr;
tpack.tcp.source=tcphp->dest;
tpack.tcp.dest=tcphp->source;
tpack.tcp.seq=0;
tpack.tcp.ack_seq=htonl(ntohl(tcphp->seq)+1);
tpack.tcp.doff=5; /* Data offset */
tpack.tcp.res1=0; /* reserved */
tpack.tcp.res2=0; /* reserved */
tpack.tcp.urg=0; /* Urgent offset valid flag */
tpack.tcp.ack=1; /* Acknowledgement field valid flag */
tpack.tcp.psh=0; /* Push flag */
tpack.tcp.rst=1; /* Reset flag */
tpack.tcp.syn=0; /* Synchronize sequence numbers flag */
tpack.tcp.fin=0; /* Finish sending flag */
tpack.tcp.window=0; /* 16-bit Window size */
tpack.tcp.check=0; /* 16-bit checksum (to be filled in below) */
tpack.tcp.urg_ptr=0; /* 16-bit urgent offset */
tpack.ip.version=4; /* 4-bit Version */
tpack.ip.ihl=5; /* 4-bit Header Length */
tpack.ip.tos=0; /* 8-bit Type of service */
tpack.ip.tot_len=htons(sizeof(struct iphdr)+sizeof(struct tcphdr)); /* 16-bit Total length */
tpack.ip.id=0; /* 16-bit ID field */
tpack.ip.frag_off=0; /* 13-bit Fragment offset */
tpack.ip.ttl=64; /* 8-bit Time To Live */
tpack.ip.protocol=IPPROTO_TCP; /* 8-bit Protocol */
tpack.ip.check=0; /* 16-bit Header checksum (filled in below) */
tpack.ip.saddr=iphp->daddr; /* 32-bit Source Address */
tpack.ip.daddr=iphp->saddr; /* 32-bit Destination Address */
pheader.source_address=(unsigned)tpack.ip.saddr;
pheader.dest_address=(unsigned)tpack.ip.daddr;
pheader.placeholder=0;
pheader.protocol=IPPROTO_TCP;
pheader.tcp_length=htons(sizeof(struct iphdr));
sendbuffer=(char *)malloc(sizeof(tpack)+sizeof(pheader));
sendto(shoe,sendbuffer,sizeof(struct iphdr)+sizeof(struct tcphdr),0,(struct sockaddr *)&sin,sizeof(sin));
#ifndef QUIET
dump(iphp,tcphp);
#endif
}
void dump(struct iphdr *iphp,struct tcphdr *tcphp)
{
fprintf(stdout,"Connection-establishment Attempt: ");
fprintf(stdout,"Thwarting...\n");
}
/////////////////////////////////////////////////
//these functions are icmp unreach
//1:netunreach
//2:hostunreach
//3:portunreach
/////////////////////////////////////////////////
void unreach(unsigned int icmpcode,struct iphdr *iphp,struct icmphdr *icmphp,int shoe)
{
char * sendbuffer1;
void dump();
struct tcphdr* tcphp;
struct ppack
{
struct iphdr ip;
struct icmphdr icmp;
} ppack;
struct sockaddr_in sin1;
sin1.sin_family=AF_INET;
sin1.sin_port=tcphp->dest;
sin1.sin_addr.s_addr=iphp->saddr;
ppack.ip.ihl=5;
ppack.ip.version=4;
ppack.ip.tos=0;
ppack.ip.tot_len=htons(sizeof(struct iphdr)+sizeof(struct icmphdr));
ppack.ip.id=0;
ppack.ip.frag_off=0;
ppack.ip.ttl=64;
ppack.ip.protocol=IPPROTO_ICMP;
ppack.ip.check=0;
ppack.ip.saddr=iphp->daddr;
ppack.ip.daddr=iphp->saddr;
ppack.icmp.type=3;
ppack.icmp.code=icmpcode;
ppack.icmp.icmpchecksum=0;
sendbuffer1=(char*)malloc(sizeof(ppack));
sendto(shoe,sendbuffer1,sizeof(struct iphdr)+sizeof(struct icmphdr),0,(struct sockaddr*)&sin1,sizeof(sin1));
}
问题点数:100、回复次数:15Top
1 楼wordsgolden(三好学生)回复于 2002-07-11 15:24:57 得分 0
我的系统是win2k server familyTop
2 楼Kevin_qing()回复于 2002-07-11 16:47:52 得分 25
SOCKET sRaw=socket(PF_INET,SOCK_RAW,0);
int bOpt=TRUE;
printf("RAW %d\n",setsockopt(sRaw,IPPROTO_IP,IP_HDRINCL,(char*)&bOpt,sizeof(bOpt)));
Top
3 楼yangtian(思想有多远,前途有多远)回复于 2002-07-11 17:00:45 得分 0
哎,晕Top
4 楼wordsgolden(三好学生)回复于 2002-07-11 17:12:17 得分 0
setsockopt(sRaw,IPPROTO_IP,IP_HDRINCL,(char*)&bOpt,sizeof(bOpt)));
出错~ 为什么?求助!
再麻烦 Kevin_qing() 大哥!Top
5 楼kingzai(stevenzhu)回复于 2002-07-11 17:12:20 得分 50
if
((sock=WSASocket(AF_INET,SOCK_RAW,IPPROTO_RAW,NULL,0,WSA_FLAG_OVERLAP
PED))==INVALID_SOCKET)
{
printf("Socket Setup Error!\n");
return false;
}
BOOL flag=true;
if (setsockopt(sock,IPPROTO_IP, IP_HDRINCL,(char
*)&flag,sizeof(flag))==SOCKET_ERROR)
{
printf("setsockopt IP_HDRINCL error!\n");
return false;
}Top
6 楼Kevin_qing()回复于 2002-07-11 17:12:20 得分 0
你的socket建立参数有问题Top
7 楼kingzai(stevenzhu)回复于 2002-07-11 17:13:14 得分 0
if
((sock=WSASocket(AF_INET,SOCK_RAW,IPPROTO_RAW,NULL,0,WSA_FLAG_OVERLAP
PED))==INVALID_SOCKET)
{
printf("Socket Setup Error!\n");
return false;
}
BOOL flag=true;
if (setsockopt(sock,IPPROTO_IP, IP_HDRINCL,(char
*)&flag,sizeof(flag))==SOCKET_ERROR)
{
printf("setsockopt IP_HDRINCL error!\n");
return false;
}Top
8 楼kingzai(stevenzhu)回复于 2002-07-11 17:14:24 得分 0
if
((sock=WSASocket(AF_INET,SOCK_RAW,IPPROTO_RAW,NULL,0,WSA_FLAG_OVERLAP
PED))==INVALID_SOCKET)
{
printf("Socket Setup Error!\n");
return false;
}
BOOL flag=true;
if (setsockopt(sock,IPPROTO_IP, IP_HDRINCL,(char
*)&flag,sizeof(flag))==SOCKET_ERROR)
{
printf("setsockopt IP_HDRINCL error!\n");
return false;
}Top
9 楼Kevin_qing()回复于 2002-07-11 17:14:53 得分 0
把shoe=WSASocket(AF_INET, SOCK_RAW, IPPROTO_TCP, NULL, 0,0);
改为shoe=socket(PF_INET,SOCK_RAW,0);
WSASocket()函数我没用过,大概是你写的第3个参数有问题
Top
10 楼wordsgolden(三好学生)回复于 2002-07-11 17:38:01 得分 0
kingzai:你的程序和 Kevin_qing的基本一样啊。我调试了一下,也是报错,拜托有时间帮我调试一下
我这个程序是防火墙联动的一个小模块Top
11 楼kingzai(stevenzhu)回复于 2002-07-11 17:45:08 得分 0
我记起来了,
注意,如果设置IP_HDRINCL 选项,那么必须具有 administrator
权限,要不就必须修改注册表:
HKEY_LOCAL_MACHINE\System\CurrentControlSet\Services\Afd\Parameter\
修改键:DisableRawSecurity(类型为DWORD),把值修改为 1。如果没有,就添加。Top
12 楼xuying()回复于 2002-07-11 20:51:22 得分 25
这是<windows网络编程技术>第13章的一端例子,除了它用udp,你用tcp外,没有什么不一样的。你试试这段程序看看。最好把错误号贴出来看看。
// Creating a raw socket
//
s = WSASocket(AF_INET, SOCK_RAW, IPPROTO_UDP, NULL, 0,0);
if (s == INVALID_SOCKET)
{
printf("WSASocket() failed: %d\n", WSAGetLastError());
return -1;
}
// Enable the IP header include option
//
bOpt = TRUE;
ret = setsockopt(s, IPPROTO_IP, IP_HDRINCL, (char *)&bOpt, sizeof(bOpt));
if (ret == SOCKET_ERROR)
{
printf("setsockopt(IP_HDRINCL) failed: %d\n", WSAGetLastError());
return -1;
}
Top
13 楼wordsgolden(三好学生)回复于 2002-07-12 08:12:42 得分 0
错误号是10022Top
14 楼kingzai(stevenzhu)回复于 2002-07-12 08:50:38 得分 0
http://www.csdn.net/expert/topic/867/867221.xml?temp=.4360468Top
15 楼kingzai(stevenzhu)回复于 2002-07-12 08:56:47 得分 0
http://www.csdn.net/expert/topic/867/867221.xml?temp=.4360468Top
16 楼wordsgolden(三好学生)回复于 2002-07-12 09:09:41 得分 0
kingzai:不好意思那个家伙是我的朋友,之所以结帖,是因为都不对啊。:(
真不知道是为什么??Top
17 楼wordsgolden(三好学生)回复于 2002-07-12 11:03:11 得分 0
这里的各位想要分的以后多多回答我的问题啊
还想给你们分 可是不知道该怎么给,反正以后回答了我的问题我就给:)Top



