当前位置: 技术问答>linux和unix
200分请教,如何知道数据包的大小
来源: 互联网 发布时间:2015-09-20
本文导语: 请教各位大哥, 用tcp连接, 我如何才能知道对方发来的数据包的大小 | 不可以的,你应该定义一个数据包头,固定大小,比如 struct tcp_head{int length, int type....}; 这个包头是每个数据包都必须发...
请教各位大哥,
用tcp连接, 我如何才能知道对方发来的数据包的大小
用tcp连接, 我如何才能知道对方发来的数据包的大小
|
不可以的,你应该定义一个数据包头,固定大小,比如
struct tcp_head{int length, int type....};
这个包头是每个数据包都必须发的
也就是说无论从A发到B或是从B发到A,
数据包的前sizeof(tcp_head)字节都必须是这个包头
发数据之前先设置tcp_head中的数据,比如数据包长度,数据包类型...
这样,你接收的时候可以这样
recv(fd, &head, sizeof(tcp_head));
char* buffer = new char[head.length];
recv(fd, buffer, head.length);
先接收包头,确定长度后再接收剩余部份
发数据的时候也一样,把head头和你要发的数据
memcpy到了块内存中再发...
struct tcp_head{int length, int type....};
这个包头是每个数据包都必须发的
也就是说无论从A发到B或是从B发到A,
数据包的前sizeof(tcp_head)字节都必须是这个包头
发数据之前先设置tcp_head中的数据,比如数据包长度,数据包类型...
这样,你接收的时候可以这样
recv(fd, &head, sizeof(tcp_head));
char* buffer = new char[head.length];
recv(fd, buffer, head.length);
先接收包头,确定长度后再接收剩余部份
发数据的时候也一样,把head头和你要发的数据
memcpy到了块内存中再发...
|
入侵操作系统内核的TCP协议栈,所有的TCP包都要通过那里,这样便可以捕获数据包的大小了……
但是这种东西需要和内核进行交互,似乎不是很简单就可以完成的,搞不好需要改写TCP协议栈的代码,还要重新编译内核……
如果是在Linux下面的话,可以通过netfilter完成这种东西,其他的Unix里面的话恐怕不改内核代码比较麻烦了。偷懒一点的方法是使用tcpdump的bpf设备,这样的话同样可以捕捉到数据包。具体怎么玩看tcpdump的代码就可以知道了(最偷懒的方法其实是和tcpdump交互,但是tcpdump一启动就把网卡转入了混杂模式,并不是所有的数据包你都需要来着)……
但是这种东西需要和内核进行交互,似乎不是很简单就可以完成的,搞不好需要改写TCP协议栈的代码,还要重新编译内核……
如果是在Linux下面的话,可以通过netfilter完成这种东西,其他的Unix里面的话恐怕不改内核代码比较麻烦了。偷懒一点的方法是使用tcpdump的bpf设备,这样的话同样可以捕捉到数据包。具体怎么玩看tcpdump的代码就可以知道了(最偷懒的方法其实是和tcpdump交互,但是tcpdump一启动就把网卡转入了混杂模式,并不是所有的数据包你都需要来着)……
|
因为tcp的数据也是一个流
无法确定某个数据包的大小
只能先发一个固定长度的数据,表明后面数据的大小
接收的时候也是先接收固定的长度,在根据这个决定下一次接收的数据大小
无法确定某个数据包的大小
只能先发一个固定长度的数据,表明后面数据的大小
接收的时候也是先接收固定的长度,在根据这个决定下一次接收的数据大小