如何用VC++写UDP协议数据包的打包封装和解包程序啊......急啊 上头让写一个利用UDP协议的打包和解包的程序,没弄过这方面的东西,哪位高手能给我一个这方面的程序和相关资料啊.......急用...可以发到我邮箱:[email protected],谢谢了 解决方案 » 免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货 不用这么费劲,实际上就是发送端怎么发的数据,接收端怎么接收。如:使用一个结构typedef struct AA{ int Flag; //标识 int Command;//命令 int DataLen; //数据长度 char Data[1024];//数据 int CheckSum; //头检验和}AAAA;这样,发送将这个数据结构直接发送出去AAAA aaaa;send((char*)&aaaa,sizeof(aaaa),....)接收端: recv(buff,...) AAAA* paaa=(AAAA*)buff; 这样的话能在网络中传递吗?可以像QQ中的UDP吗?那不要这种呢,就是想要UDP包,该怎么弄 这样说吧,怎么把结构体数据打成UDP包的格式啊? 晕,会建立UDP SOCKET然后发送数据不? 这种会弄,我的意思是这样的,将结构体(如struct a[100])打成一个UDP包,运用udp传输的特点,在网络中传输这个UDP包,当然要在这个udp包的前头要加上一些源地址、目的地址什么的一些东西,最后是要的着东西。怎么做才能把结构体打成udp包?还有我还不理解这个数据包的概念? head.h#ifndef HEAD_H#define HEAD_Htypedef struct udp_head{ unsigned short s_port; unsigned short d_port; unsigned short length; unsigned short checkSum;} UdpHead;typedef struct ip_head{ unsigned char ver_hdr;//version and header length unsigned char tos; unsigned short to_length; unsigned short identi; unsigned short flags_fragment; unsigned char ttl; unsigned char protocol; unsigned short checksum; unsigned long source_addr; unsigned long dest_addr;}IpHead;#endifudp.cpp#include"head.h"#include<iostream>#include<string>#include<WinSock2.h>#include<Ws2tcpip.h>using namespace std;#pragma comment(lib,"ws2_32.lib")#define DEST_PORT 1000#define SOUR_PORT 900bool IniWSA(){ static bool hasIni=false; if(!hasIni) { WORD word=MAKEWORD(2,2); WSADATA wsaData; if(WSAStartup(word,&wsaData)) { cout<<"failed to start up"<<endl; return false; } if(wsaData.wVersion !=word) { cout<<"failed to get the right version"<<endl; return false; } hasIni=true; } return hasIni;}int main(){ if(!IniWSA()) { cout<<"sorry,can't initilize WSA"<<endl; return 1; } //SOCKET uSocket=WSASocket(AF_INET,SOCK_RAW,IPPROTO_UDP,NULL,0,WSA_FLAG_OVERLAPPED); SOCKET uSocket=socket(AF_INET,0,SOCK_RAW);//设置为原始socket,以便打包IP if(uSocket==INVALID_SOCKET) { cout<<"create socket error"<<endl; return 2; } //char flag=1; BOOL bInFlag = TRUE; if(SOCKET_ERROR==setsockopt(uSocket,IPPROTO_IP,IP_HDRINCL,(char*)&bInFlag,sizeof(bInFlag))) { cout<<"set socket opt error"<<endl; return 3; } int nSendTimeOut = 1000; /*if(SOCKET_ERROR == setsockopt(uSocket, SOL_SOCKET, SO_SNDTIMEO, (char *)&nSendTimeOut, sizeof(nSendTimeOut))) { cout<<"set socket opt error"<<endl; return 3; }*/ SOCKADDR_IN addr; memset(&addr,0,sizeof(SOCKADDR_IN)); addr.sin_addr .S_un.S_addr=inet_addr("127.0.0.1"); addr.sin_family =AF_INET; addr.sin_port=htons(DEST_PORT); string str("hello world"); UdpHead uheader; memset(&uheader,0,sizeof(UdpHead)); uheader.checkSum =0; uheader.d_port =htons(DEST_PORT); uheader.length =htons(sizeof(UdpHead)+str.size ()); uheader.s_port =htons(SOUR_PORT); IpHead iheader; memset(&iheader,0,sizeof(IpHead)); iheader.checksum =0; iheader.flags_fragment=0; iheader.identi=0; iheader.protocol =0x11; iheader.tos=0; iheader.to_length=htonl(sizeof(iheader)+sizeof(uheader)+str.size()); iheader.ttl =128; iheader.ver_hdr =0x45; iheader.dest_addr =inet_addr("127.0.0.1"); iheader.source_addr =inet_addr("127.0.0.1"); char* buf=(char*)malloc(10000); memset(buf,0,10000); memcpy(buf,&iheader,sizeof(iheader)); memcpy(buf+sizeof(iheader),&uheader,sizeof(uheader)); memcpy(buf+sizeof(iheader)+sizeof(uheader),str.c_str (),str.size ()); int len; while(1) { if(len=sendto(uSocket,buf,sizeof(iheader)+sizeof(uheader)+str.size(),0,(sockaddr*)&addr,sizeof(addr))) { cout<<"ok"<<endl; } else break; } shutdown(uSocket,2); closesocket(uSocket); WSACleanup(); getchar();} 好吧,对于尚要学习关于UDP数据包筛选的新手彻底糊涂了。 vc++中怎么判断用户是否按下了回车键 高分悬赏,CreateService的一个老问题 创建一个10000*10000的HDC设备场景 这句英文怎样解释啊? 有没有*.lib的反编译工具? 年过完了,呜呜!!! 请教 动态对话框的切换问题 如何处理编译成功,运行出错的情况?描述在文内..... 劳驾!小弟急需有关于开发Windows平台下的驱动程序的资料!那位大侠知道请告知! cdockablepane分割问题 我建立了一个工程,基于CFormView的,运行中怎么回到主窗体上?
如:使用一个结构
typedef struct AA
{
int Flag; //标识
int Command;//命令
int DataLen; //数据长度
char Data[1024];//数据
int CheckSum; //头检验和
}AAAA;这样,发送将这个数据结构直接发送出去
AAAA aaaa;
send((char*)&aaaa,sizeof(aaaa),....)接收端:
recv(buff,...)
AAAA* paaa=(AAAA*)buff;
那不要这种呢,就是想要UDP包,该怎么弄
晕,会建立UDP SOCKET然后发送数据不?
这种会弄,我的意思是这样的,将结构体(如struct a[100])打成一个UDP包,运用udp传输的特点,在网络中传输这个UDP包,当然要在这个udp包的前头要加上一些源地址、目的地址什么的一些东西,最后是要的着东西。怎么做才能把结构体打成udp包?还有我还不理解这个数据包的概念?
#define HEAD_H
typedef struct udp_head
{
unsigned short s_port;
unsigned short d_port;
unsigned short length;
unsigned short checkSum;
} UdpHead;typedef struct ip_head
{
unsigned char ver_hdr;//version and header length
unsigned char tos;
unsigned short to_length;
unsigned short identi;
unsigned short flags_fragment;
unsigned char ttl;
unsigned char protocol;
unsigned short checksum;
unsigned long source_addr;
unsigned long dest_addr;
}IpHead;#endifudp.cpp
#include"head.h"
#include<iostream>
#include<string>
#include<WinSock2.h>
#include<Ws2tcpip.h>
using namespace std;
#pragma comment(lib,"ws2_32.lib")
#define DEST_PORT 1000
#define SOUR_PORT 900bool IniWSA()
{
static bool hasIni=false;
if(!hasIni)
{
WORD word=MAKEWORD(2,2);
WSADATA wsaData;
if(WSAStartup(word,&wsaData))
{
cout<<"failed to start up"<<endl;
return false;
}
if(wsaData.wVersion !=word)
{
cout<<"failed to get the right version"<<endl;
return false;
}
hasIni=true;
}
return hasIni;
}int main()
{
if(!IniWSA())
{
cout<<"sorry,can't initilize WSA"<<endl;
return 1;
}
//SOCKET uSocket=WSASocket(AF_INET,SOCK_RAW,IPPROTO_UDP,NULL,0,WSA_FLAG_OVERLAPPED);
SOCKET uSocket=socket(AF_INET,0,SOCK_RAW);//设置为原始socket,以便打包IP
if(uSocket==INVALID_SOCKET)
{
cout<<"create socket error"<<endl;
return 2;
}
//char flag=1;
BOOL bInFlag = TRUE;
if(SOCKET_ERROR==setsockopt(uSocket,IPPROTO_IP,IP_HDRINCL,(char*)&bInFlag,sizeof(bInFlag)))
{
cout<<"set socket opt error"<<endl;
return 3;
}
int nSendTimeOut = 1000;
/*if(SOCKET_ERROR == setsockopt(uSocket, SOL_SOCKET, SO_SNDTIMEO, (char *)&nSendTimeOut, sizeof(nSendTimeOut)))
{
cout<<"set socket opt error"<<endl;
return 3;
}
*/
SOCKADDR_IN addr;
memset(&addr,0,sizeof(SOCKADDR_IN));
addr.sin_addr .S_un.S_addr=inet_addr("127.0.0.1");
addr.sin_family =AF_INET;
addr.sin_port=htons(DEST_PORT); string str("hello world");
UdpHead uheader;
memset(&uheader,0,sizeof(UdpHead));
uheader.checkSum =0;
uheader.d_port =htons(DEST_PORT);
uheader.length =htons(sizeof(UdpHead)+str.size ());
uheader.s_port =htons(SOUR_PORT); IpHead iheader;
memset(&iheader,0,sizeof(IpHead));
iheader.checksum =0;
iheader.flags_fragment=0;
iheader.identi=0;
iheader.protocol =0x11;
iheader.tos=0;
iheader.to_length=htonl(sizeof(iheader)+sizeof(uheader)+str.size());
iheader.ttl =128;
iheader.ver_hdr =0x45;
iheader.dest_addr =inet_addr("127.0.0.1");
iheader.source_addr =inet_addr("127.0.0.1"); char* buf=(char*)malloc(10000);
memset(buf,0,10000);
memcpy(buf,&iheader,sizeof(iheader));
memcpy(buf+sizeof(iheader),&uheader,sizeof(uheader));
memcpy(buf+sizeof(iheader)+sizeof(uheader),str.c_str (),str.size ());
int len;
while(1)
{
if(len=sendto(uSocket,buf,sizeof(iheader)+sizeof(uheader)+str.size(),0,(sockaddr*)&addr,sizeof(addr)))
{
cout<<"ok"<<endl;
}
else
break;
}
shutdown(uSocket,2);
closesocket(uSocket);
WSACleanup();
getchar();
}