200分请教,如何知道数据包的大小

see22 2005-04-06 01:14:06
请教各位大哥,
用tcp连接, 我如何才能知道对方发来的数据包的大小
...全文
251 4 打赏 收藏 转发到动态 举报
写回复
用AI写文章
4 条回复
切换为时间正序
请发表友善的回复…
发表回复
nodummy 2005-04-06
  • 打赏
  • 举报
回复
入侵操作系统内核的TCP协议栈,所有的TCP包都要通过那里,这样便可以捕获数据包的大小了……

但是这种东西需要和内核进行交互,似乎不是很简单就可以完成的,搞不好需要改写TCP协议栈的代码,还要重新编译内核……

如果是在Linux下面的话,可以通过netfilter完成这种东西,其他的Unix里面的话恐怕不改内核代码比较麻烦了。偷懒一点的方法是使用tcpdump的bpf设备,这样的话同样可以捕捉到数据包。具体怎么玩看tcpdump的代码就可以知道了(最偷懒的方法其实是和tcpdump交互,但是tcpdump一启动就把网卡转入了混杂模式,并不是所有的数据包你都需要来着)……
cnwolf 2005-04-06
  • 打赏
  • 举报
回复
因为tcp的数据也是一个流

无法确定某个数据包的大小

只能先发一个固定长度的数据,表明后面数据的大小

接收的时候也是先接收固定的长度,在根据这个决定下一次接收的数据大小
nightfallrove 2005-04-06
  • 打赏
  • 举报
回复
不可以的,你应该定义一个数据包头,固定大小,比如
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到了块内存中再发...
see22 2005-04-06
  • 打赏
  • 举报
回复
补充一下, 要用c语言编程实现

23,120

社区成员

发帖
与我相关
我的任务
社区描述
Linux/Unix社区 应用程序开发区
社区管理员
  • 应用程序开发区社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧