上头让写一个利用UDP协议的打包和解包的程序,没弄过这方面的东西,哪位高手能给我一个这方面的程序和相关资料啊.......
急用...可以发到我邮箱:[email protected],谢谢了

解决方案 »

  1.   

    不用这么费劲,实际上就是发送端怎么发的数据,接收端怎么接收。
    如:使用一个结构
    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;
      

  2.   

    这样的话能在网络中传递吗?可以像QQ中的UDP吗?
    那不要这种呢,就是想要UDP包,该怎么弄
      

  3.   

    这样说吧,怎么把结构体数据打成UDP包的格式啊?
      

  4.   


    晕,会建立UDP SOCKET然后发送数据不?
      

  5.   


    这种会弄,我的意思是这样的,将结构体(如struct a[100])打成一个UDP包,运用udp传输的特点,在网络中传输这个UDP包,当然要在这个udp包的前头要加上一些源地址、目的地址什么的一些东西,最后是要的着东西。怎么做才能把结构体打成udp包?还有我还不理解这个数据包的概念?
      

  6.   

    head.h#ifndef HEAD_H
    #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();
    }
      

  7.   

    好吧,对于尚要学习关于UDP数据包筛选的新手彻底糊涂了。