我要利用TCP/IP协议从用户端向服务器端定时发送数据。协议的格式已经确定了。大致如下:
24H 数据长度字节 54H 数据1 数据n 效验和24H:为1字节数据头
数据长度字节:为数据长度字节后面的所有数据长度。
54H:为指令
...
...我已经用一个BYTE数组将这些要发送的数据保存好了。现在我不知道该怎么才能在这组数据前面加上TCP头部和IP头部。有没有哪位有经验的大侠能给我指点一下:服务器的IP: 223.116.251.0,端口号为10000
1.怎么封包
2.怎么拆包
3.我要向服务器端定时发送数据,在发送数据包的过程中要考虑哪些问题,以前曾经看到过有人提到过丢包及粘包等问题,是不是这些问题我也要考虑到?
最好有一些代码示范一下,多谢了。
24H 数据长度字节 54H 数据1 数据n 效验和24H:为1字节数据头
数据长度字节:为数据长度字节后面的所有数据长度。
54H:为指令
...
...我已经用一个BYTE数组将这些要发送的数据保存好了。现在我不知道该怎么才能在这组数据前面加上TCP头部和IP头部。有没有哪位有经验的大侠能给我指点一下:服务器的IP: 223.116.251.0,端口号为10000
1.怎么封包
2.怎么拆包
3.我要向服务器端定时发送数据,在发送数据包的过程中要考虑哪些问题,以前曾经看到过有人提到过丢包及粘包等问题,是不是这些问题我也要考虑到?
最好有一些代码示范一下,多谢了。
/* 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;
};
{
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包的数据。
SOCKET通讯的时候会自动加解TCP/IP头的
如果要自已去实现TCP/IP协议的话很累
推荐使用WINCAP实现
可以自已定义底层数据包,但要注意TCP/IP头不能加错(而且要自己在前面添加MAC地址),
否则在网络上可能就丢包了
你用 WinSock 的 send 直接發,底層驅動會給你加上 TCP頭與 IP頭,還有以太網頭,這都不是你考慮的