我要利用TCP/IP协议从用户端向服务器端定时发送数据。协议的格式已经确定了。大致如下:
24H  数据长度字节  54H  数据1  数据n   效验和24H:为1字节数据头
数据长度字节:为数据长度字节后面的所有数据长度。
54H:为指令
...
...我已经用一个BYTE数组将这些要发送的数据保存好了。现在我不知道该怎么才能在这组数据前面加上TCP头部和IP头部。有没有哪位有经验的大侠能给我指点一下:服务器的IP: 223.116.251.0,端口号为10000
1.怎么封包
2.怎么拆包
3.我要向服务器端定时发送数据,在发送数据包的过程中要考虑哪些问题,以前曾经看到过有人提到过丢包及粘包等问题,是不是这些问题我也要考虑到?
最好有一些代码示范一下,多谢了。

解决方案 »

  1.   


    /* The IP header */
    typedef struct _IPHEADER {
            unsigned char  header_len:4;
            unsigned char  version:4;   
            unsigned char  tos;            // type of service
            unsigned short total_len;      // length of the packet
            unsigned short ident;          // unique identifier
            unsigned short flags;          
            unsigned char  ttl;            
            unsigned char  proto;          // protocol ( IP , TCP, UDP etc)
            unsigned short checksum;       
            unsigned int   sourceIP;
            unsigned int   destIP;}IPHEADER;/*-------------------zhuwei add(2002.11.9)-----------------------------*/
    #define UDP_HEAD_LEN 8 /* UDP head length */#define PSEUDO_HEAD_LEN 12 /* Pseudo head length */#define ICMP_HEAD_LEN 4 /* ICMP head length */struct TCPPacketHead {
    WORD SourPort;
    WORD DestPort;
    DWORD SeqNo;
    DWORD AckNo;
    BYTE HLen;
    BYTE Flag;
    WORD WndSize;
    WORD ChkSum;
    WORD UrgPtr;
    };struct ICMPPacketHead {
    BYTE Type;
    BYTE Code;
    WORD ChkSum;
    };struct UDPPacketHead {
    WORD SourPort;
    WORD DestPort;
    WORD Len;
    WORD ChkSum;
    };
      

  2.   

    我给IP和TCP结构体赋值后,这两个结构体和后面数据段的BYTE数组一起构成了要传输的数据。那这三部分是以什么形式连接的呢?用一个结构体把这三部分组合到一起?
      

  3.   

    typedef struct _IPHeader
    {
    UCHAR iph_verlen; // 版本和长度
    UCHAR iph_tos; // 服务类型
    USHORT iph_length; // 大小
    USHORT iph_id; // ID
    USHORT iph_offset; // 标志和片段的偏移位置
    UCHAR iph_ttl; // 存活期
    UCHAR iph_protocol; // 协议
    USHORT iph_xsum; // 头校验和
    ULONG iph_src; // 来源IP
    ULONG iph_dest; // 目的IP
    } IPHeader; typedef struct _TCP_HEADER
    {
    USHORT th_sport; //16位源端口
    USHORT th_dport; //16位目的端口
    unsigned int th_seq; //32位序列号
    unsigned int th_ack; //32位确认号
    unsigned char th_lenres; //4位首部长度+6位保留字中的4位
    unsigned char th_flag; //2位保留字+6位标志位
    USHORT th_win; //16位窗口大小
    USHORT th_sum; //16位校验和
    USHORT th_urp; //16位紧急数据偏移量
    } TCP_HEADER;不用结构,在缓冲区里依次排放。
    TCP和IP一般是分开处理的,TCP头加数据构成TCP包,到了IP层,把整个TCP包看作数据,切割或者组合,再加上IP包头发送。一个IP包可以包含多个TCP包,也可以只有半个TCP包的数据。
      

  4.   

    既然你在VC/MFC里面问题,是在windows下的程序不?如果是,用windows的socket不用考虑TCP/IP的,都是封装好的,你只要关注上层协议。
      

  5.   

    能不能推荐点学习TCP/IP编程的教材或是好的资料。我刚开始接触,好多东西都不清楚,最好是针对VC开发TCP/IP协议的实例。
      

  6.   

    既然是这样,你现在只要了解Socket就够了。在MSDN里把socket function都看一下,里面有Sample Code。自己再做程序来试。前面的回复都不用看了。
      

  7.   

    用socket来发送和接收tcp包,不需要自己来增加tcp头和ip头,只需要调用send就可以了
      

  8.   

    楼主想自己实现TCP/IP协议栈?如果真的像你这么做了,你用什么API来发送数据呢?操作系统已经实现了协议栈,调用它的API会自动帮你分包并加上对应的IP头
      

  9.   

    将IP和端口号绑定好后,直接send数据就行了,socket会自动为数据加上TCP头和IP头的.
      

  10.   

    使用CSocket类来收发数据就可以了,不需要自己来增加tcp头和ip头
    SOCKET通讯的时候会自动加解TCP/IP头的
    如果要自已去实现TCP/IP协议的话很累
    推荐使用WINCAP实现
    可以自已定义底层数据包,但要注意TCP/IP头不能加错(而且要自己在前面添加MAC地址),
    否则在网络上可能就丢包了
      

  11.   

    可以看看《windows网络程序设计》
      

  12.   

    我已经用一个BYTE数组将这些要发送的数据保存好了。现在我不知道该怎么才能在这组数据前面加上TCP头部和IP头部-----------------------
    你用 WinSock 的 send 直接發,底層驅動會給你加上 TCP頭與 IP頭,還有以太網頭,這都不是你考慮的