Z
zjxxln
Unregistered / Unconfirmed
GUEST, unregistred user!
//---------------------------------------------------------------------------
#include <vcl.h>
#pragma hdrstop
#include "Unit1.h"
//---------------------------------------------------------------------------
#include "Winsock2.h"
#include "ws2tcpip.h"
//---------------------------------------------------------------------------
#pragma package(smart_init)
#pragma resource "*.dfm"
//接收
const rdPort=4003; //数据报端口 4003
const urPort=4005; //原始端口 4005 UDP
typedef struct ip_hd
{
unsigned char ip_verlen; // IP头长度
unsigned char ip_tos; // IP服务类型
unsigned short ip_totallength; // 数据包长度
unsigned short ip_id; // 标识段
unsigned short ip_offset; // 标志段
unsigned char ip_ttl; // 包生存时间
unsigned char ip_protocol; // 协议类型
unsigned short ip_checksum; // IP头校验和
unsigned int ip_srcaddr; // 源地址
unsigned int ip_destaddr; // 目标地址
}IP_HD;
typedef struct udp_hd //定义UDP首部
{
unsigned short src_portno; // 源端口号
unsigned short dst_portno; // 目标端口号
unsigned short udp_length; // UDP包长度
unsigned short udp_checksum; // UDP校验和
}UDP_HD;
TForm1 *Form1;
//---------------------------------------------------------------------------
__fastcall TForm1::TForm1(TComponent* Owner)
: TForm(Owner)
{
}
//---------------------------------------------------------------------------
void __fastcall TForm1::Button1Click(TObject *Sender)
{WSADATA wsaData;
SOCKET u_r;
int err=WSAStartup(MAKEWORD(2,2),&wsaData);
if (err!=0)
ShowMessage("不能初始化WinSock!");
bool on=true;
u_r=socket(AF_INET,SOCK_RAW, IPPROTO_UDP);
if (u_r==INVALID_SOCKET )
ShowMessage(IntToStr(WSAGetLastError()));
setsockopt(u_r,IPPROTO_IP,IP_HDRINCL,(char *)&on,sizeof(on));
//需要管理员身份
IP_HD *ip;
UDP_HD *udp;
int head_len=sizeof(IP_HD)+sizeof(UDP_HD);
char buffer[1000]={0};
String myIP="";
sockaddr_in in_r;
in_r.sin_family=AF_INET;
in_r.sin_addr.s_addr=inet_addr("目标地址,随便添");
in_r.sin_port=htons(rdPort);
bool optval = true;
/******** 填充IP数据包的头部 ******/
ip=(IP_HD *)buffer;
ip->ip_verlen=(4<<4)|(sizeof(IP_HD)/sizeof(unsigned long));
/** 版本一般的是 4 **/
ip->ip_tos=0; /** 服务类型 **/
ip->ip_totallength=htons(head_len); /** IP数据包的长度 **/
ip->ip_id=0; /** 让系统去填写 **/
ip->ip_offset=0; /** 和上面一样,省点时间 **/
ip->ip_ttl=128; /** 最长的时间 128 **/
ip->ip_protocol=IPPROTO_UDP; /** 我们要发的是 UDP包 **/
ip->ip_checksum=0; /** 校验和让系统去做 **/
ip->ip_destaddr=in_r.sin_addr.s_addr;/** 目标对象 **/
ip->ip_srcaddr=inet_addr("自己的地址");
/** 源对象 **/
/******* 开始填写UDP数据包 *****/
head_len=sizeof(UDP_HD);
udp=(UDP_HD *)(buffer +sizeof(IP_HD));
udp->src_portno=htons(urPort);
udp->dst_portno=in_r.sin_port;
udp->udp_length=htons(head_len);
udp->udp_checksum=0;
head_len=sizeof(IP_HD)+sizeof(UDP_HD);
sendto(u_r,buffer,head_len,0,(sockaddr*)&in_r,sizeof(in_r));
ShowMessage(IntToStr(WSAGetLastError()));//就是这里有错误,错误代码100049,
//错误含义:不能分配请求的地址。A P I调用中指定的地址对那个函数来说无效时,
就会产生这样的错误。例如,若在b i n d调用中指定一个I P地址,但却没有对应的本地I P接口,
便会产生这样的错误。另外,通过c o n n e c t、W S A C o n n e c t、s e n d t o、
W S A S e n d To和W S A J o i n L e a f这四个函数为准备连接的远程计算机指定端口0时,
也会产生这样的错误。
}
//---------------------------------------------------------------------------
#include <vcl.h>
#pragma hdrstop
#include "Unit1.h"
//---------------------------------------------------------------------------
#include "Winsock2.h"
#include "ws2tcpip.h"
//---------------------------------------------------------------------------
#pragma package(smart_init)
#pragma resource "*.dfm"
//接收
const rdPort=4003; //数据报端口 4003
const urPort=4005; //原始端口 4005 UDP
typedef struct ip_hd
{
unsigned char ip_verlen; // IP头长度
unsigned char ip_tos; // IP服务类型
unsigned short ip_totallength; // 数据包长度
unsigned short ip_id; // 标识段
unsigned short ip_offset; // 标志段
unsigned char ip_ttl; // 包生存时间
unsigned char ip_protocol; // 协议类型
unsigned short ip_checksum; // IP头校验和
unsigned int ip_srcaddr; // 源地址
unsigned int ip_destaddr; // 目标地址
}IP_HD;
typedef struct udp_hd //定义UDP首部
{
unsigned short src_portno; // 源端口号
unsigned short dst_portno; // 目标端口号
unsigned short udp_length; // UDP包长度
unsigned short udp_checksum; // UDP校验和
}UDP_HD;
TForm1 *Form1;
//---------------------------------------------------------------------------
__fastcall TForm1::TForm1(TComponent* Owner)
: TForm(Owner)
{
}
//---------------------------------------------------------------------------
void __fastcall TForm1::Button1Click(TObject *Sender)
{WSADATA wsaData;
SOCKET u_r;
int err=WSAStartup(MAKEWORD(2,2),&wsaData);
if (err!=0)
ShowMessage("不能初始化WinSock!");
bool on=true;
u_r=socket(AF_INET,SOCK_RAW, IPPROTO_UDP);
if (u_r==INVALID_SOCKET )
ShowMessage(IntToStr(WSAGetLastError()));
setsockopt(u_r,IPPROTO_IP,IP_HDRINCL,(char *)&on,sizeof(on));
//需要管理员身份
IP_HD *ip;
UDP_HD *udp;
int head_len=sizeof(IP_HD)+sizeof(UDP_HD);
char buffer[1000]={0};
String myIP="";
sockaddr_in in_r;
in_r.sin_family=AF_INET;
in_r.sin_addr.s_addr=inet_addr("目标地址,随便添");
in_r.sin_port=htons(rdPort);
bool optval = true;
/******** 填充IP数据包的头部 ******/
ip=(IP_HD *)buffer;
ip->ip_verlen=(4<<4)|(sizeof(IP_HD)/sizeof(unsigned long));
/** 版本一般的是 4 **/
ip->ip_tos=0; /** 服务类型 **/
ip->ip_totallength=htons(head_len); /** IP数据包的长度 **/
ip->ip_id=0; /** 让系统去填写 **/
ip->ip_offset=0; /** 和上面一样,省点时间 **/
ip->ip_ttl=128; /** 最长的时间 128 **/
ip->ip_protocol=IPPROTO_UDP; /** 我们要发的是 UDP包 **/
ip->ip_checksum=0; /** 校验和让系统去做 **/
ip->ip_destaddr=in_r.sin_addr.s_addr;/** 目标对象 **/
ip->ip_srcaddr=inet_addr("自己的地址");
/** 源对象 **/
/******* 开始填写UDP数据包 *****/
head_len=sizeof(UDP_HD);
udp=(UDP_HD *)(buffer +sizeof(IP_HD));
udp->src_portno=htons(urPort);
udp->dst_portno=in_r.sin_port;
udp->udp_length=htons(head_len);
udp->udp_checksum=0;
head_len=sizeof(IP_HD)+sizeof(UDP_HD);
sendto(u_r,buffer,head_len,0,(sockaddr*)&in_r,sizeof(in_r));
ShowMessage(IntToStr(WSAGetLastError()));//就是这里有错误,错误代码100049,
//错误含义:不能分配请求的地址。A P I调用中指定的地址对那个函数来说无效时,
就会产生这样的错误。例如,若在b i n d调用中指定一个I P地址,但却没有对应的本地I P接口,
便会产生这样的错误。另外,通过c o n n e c t、W S A C o n n e c t、s e n d t o、
W S A S e n d To和W S A J o i n L e a f这四个函数为准备连接的远程计算机指定端口0时,
也会产生这样的错误。
}
//---------------------------------------------------------------------------