开一个线程进行winpcap的接收和发送的问题??

CBEMA 2009-11-19 02:37:59
方案1:
利用timer定时发送数据包给目标网络,利用专门接收的线程接收目标网络的数据。可以实现不间断通信。

方案2:
利用专门线程发送给目标网络,然后接收目标网络的数据。收不到目标网络的数据。


是不是利用winpcap,不可以将接收和发送放到同一个线程中去??还是有其他原因???
...全文
387 30 打赏 收藏 转发到动态 举报
写回复
用AI写文章
30 条回复
切换为时间正序
请发表友善的回复…
发表回复
hao0716 2009-11-20
  • 打赏
  • 举报
回复
使用pcap确实不应该把接收和发送放到同一个线程
接收进程直接调用的回调函数 而且是阻塞的
我一般开两个线程 一个接受一个发送
主函数还能打印点实时信息

不过用pcap做包无需考虑arp 毕竟数据都是自己填充的 只不过仿协议的话栈要自己写
CBEMA 2009-11-20
  • 打赏
  • 举报
回复
[Quote=引用 23 楼 wchnjstar 的回复:]
不知道你的具体应用场景,提醒个问题。收发放在一个线程应该是可以的,网络本来就应该是双工的。你的收发是不是同一块网卡?如果是请注意收和发不能是同一类型的,否则就是发出的包又被捕回。
[/Quote]
发出的包被我过滤了。
CBEMA 2009-11-20
  • 打赏
  • 举报
回复
解决了,逻辑问题。方案一二都可以,也不会丢贞。
lvyinghong 2009-11-20
  • 打赏
  • 举报
回复
以前看过winpcap的文档,他是实现了一个NDIS的 协议层来的。

不过他目的事抓包,不是你这样用途,你真要那么用,还是搞个 NDIS的协议层驱动比较好,不然肯定效率是不行的。

不知道代码是怎么写到,看不到代码大家也不好分析哪里的问题了。 至少理论上一个线程应该是可以的,你自己去看看winpcap的好了。

不知道楼主是不是用来做什么见不得人的事情?o(∩_∩)o...
james_hw 2009-11-20
  • 打赏
  • 举报
回复
[Quote=引用楼主 cbema 的回复:]
方案1:
利用timer定时发送数据包给目标网络,利用专门接收的线程接收目标网络的数据。可以实现不间断通信。

方案2:
利用专门线程发送给目标网络,然后接收目标网络的数据。收不到目标网络的数据。


是不是利用winpcap,不可以将接收和发送放到同一个线程中去??还是有其他原因???

[/Quote]

我觉得方案一挺好的,方案二的目的是不是为了避免接收目标网络的数据乱序所设置的?我觉得方案二不存在问题,有可能你的包发出去被丢弃了。(应该和wincap无关吧)
CBEMA 2009-11-20
  • 打赏
  • 举报
回复
[Quote=引用 26 楼 hao0716 的回复:]
使用pcap确实不应该把接收和发送放到同一个线程
接收进程直接调用的回调函数 而且是阻塞的我一般开两个线程 一个接受一个发送
主函数还能打印点实时信息

不过用pcap做包无需考虑arp 毕竟数据都是自己填充的 只不过仿协议的话栈要自己写
[/Quote]

接收进程是指我做的程序本身还是winpcap的进程??
可不可请教楼上,你的收发程序是否会出现丢贞的现象。
我的意思是说如果超时设置的比较小,比如30ms是,是否会少接收一贞。

我用的是百兆网卡,100*1024*1024=104857600bit 这是一秒的理论bit传输值
假设11bit代表一个字节(我不了解它实际传输多少bit表示一个字节,这里用串口异步传输算得),
100*1024*1024/11=9532509Byte 这是一秒的理论Byte传输值

100*1024*1024/11*1000=9532Byte 这是一毫秒的理论Byte传输值
55*9532=524425这是55毫秒的理论Byte传输值
但是我的程序只能做到55稳定传输3000Byte,不知道你有没有遇到过???


dong364 2009-11-19
  • 打赏
  • 举报
回复
跟是否同一线程有关系吗?不解。多线程无非是让cpu合理分配时间块而已。肯定是你代码有问题。
wchnjstar 2009-11-19
  • 打赏
  • 举报
回复
不知道你的具体应用场景,提醒个问题。收发放在一个线程应该是可以的,网络本来就应该是双工的。你的收发是不是同一块网卡?如果是请注意收和发不能是同一类型的,否则就是发出的包又被捕回。
Wenxy1 2009-11-19
  • 打赏
  • 举报
回复
算了,不说了,什么都说完了。
CBEMA 2009-11-19
  • 打赏
  • 举报
回复
大哥,我没有你研究得那么高深,链路层的数据是直接被我截获的,对于电脑里已经做好tcp/ip协议组来说,他的确是一个废包。在我的程序里,只要它遵循了以太网协议格式,具体里面的内容我都可以自己定的。
我的数据包首先进入网卡驱动是被拷入到一个内存区域,电脑里的网络驱动会去分析它,而且肯定认为是错的,但是同时我利用winpcap技术同样也将这段内存的内容拷过来,然后我在我的程序中分析的,利用我的协议处理。
Wenxy1 2009-11-19
  • 打赏
  • 举报
回复
[Quote=引用楼主 cbema 的回复:]
方案1:
利用timer定时发送数据包给目标网络,利用专门接收的线程接收目标网络的数据。可以实现不间断通信。

方案2:
利用专门线程发送给目标网络,然后接收目标网络的数据。收不到目标网络的数据。


是不是利用winpcap,不可以将接收和发送放到同一个线程中去??还是有其他原因???

[/Quote]

再强调一点:网络环境在变化,每一帧数据,在网络上随时会发会被丢弃的情况。
Wenxy1 2009-11-19
  • 打赏
  • 举报
回复
[Quote=引用 17 楼 cbema 的回复:]
我说的是链路层(DLC)http://baike.baidu.com/view/1341440.htm

ARP是DLC Header
IP是网络层
TCP是运输层


我能直接截获DLC,不考虑它的上层。所以与协议无关。
[/Quote]

跟协议有关,TCP包也被封在以太网帧里,但是这个帧在网络上传输里,随时会丢弃,但是,TCP协议保证可靠性,因为TCP有超时重传,累计确认等等机制。
CBEMA 2009-11-19
  • 打赏
  • 举报
回复
[Quote=引用 16 楼 wenxy1 的回复:]
引用 14 楼 cbema 的回复:
呵呵。
你说的,和我想问的不太一样啊!!




是不是利用winpcap,不可以将接收和发送放到同一个线程中去??还是有其他原因???
你还想问什么?不如自己去认真改代码,或者看书。
该说的,我都说完了。
[/Quote]

无语了,所问非所答。
CBEMA 2009-11-19
  • 打赏
  • 举报
回复

我说的是链路层(DLC)http://baike.baidu.com/view/1341440.htm

ARP是DLC Header
IP是网络层
TCP是运输层


我能直接截获DLC,不考虑它的上层。所以与协议无关。
Wenxy1 2009-11-19
  • 打赏
  • 举报
回复
[Quote=引用 14 楼 cbema 的回复:]
呵呵。
你说的,和我想问的不太一样啊!!


[/Quote]

是不是利用winpcap,不可以将接收和发送放到同一个线程中去??还是有其他原因???
你还想问什么?不如自己去认真改代码,或者看书。
该说的,我都说完了。
Wenxy1 2009-11-19
  • 打赏
  • 举报
回复
你再想想,要是发送TCP,只要网络正常,主机不死机,就不会导致TCP包丢失。
跟协议有关。:)
CBEMA 2009-11-19
  • 打赏
  • 举报
回复
呵呵。
你说的,和我想问的不太一样啊!!

Wenxy1 2009-11-19
  • 打赏
  • 举报
回复
[Quote=引用 11 楼 cbema 的回复:]
引用 9 楼 wenxy1 的回复:
我曾经用windows 2003 SDK中的API, SendARP扫描一个LAN里的全部IP地址,例如255个IP ,用一个线程去发,用另一个线程去收,出问题,总有一些IP地址没有扫描出来。
但是我用一个线程发3个ARP包(同一个IP的),然后再接收,就成功。
呵呵,速度也快,255个线程。


255个,你可真强啊。我的程序不想开太多线程,光是数据处理就已经很占时间了。

ARP有时不一定被成功接收的,所以总有一些IP地址没有扫描出来。

你不是讲收到到数据么,上面就是我讲的原因。

[/Quote]
Wenxy1 2009-11-19
  • 打赏
  • 举报
回复
考虑以下三点,
1. ARP包不保证可靠性,那么,在交换机比较忙的情况下,会出现cache用光,那么,你发送的ARP包的应答包可能会丢失。
2. 或者,网卡接收到ARP应答包后,协议栈的ARP接收队列链表达到最大值,也会丢弃。
3. 或者,网卡接收到ARP包后,没有及时响应或者ARP接收队列链表达到最大值,也会丢弃,因此不回做出响应此ARP请求。
CBEMA 2009-11-19
  • 打赏
  • 举报
回复
[Quote=引用 9 楼 wenxy1 的回复:]
我曾经用windows 2003 SDK中的API, SendARP扫描一个LAN里的全部IP地址,例如255个IP ,用一个线程去发,用另一个线程去收,出问题,总有一些IP地址没有扫描出来。
但是我用一个线程发3个ARP包(同一个IP的),然后再接收,就成功。
呵呵,速度也快,255个线程
[/Quote]

255个,你可真强啊。我的程序不想开太多线程,光是数据处理就已经很占时间了。

ARP有时不一定被成功接收的,所以总有一些IP地址没有扫描出来。
加载更多回复(10)

18,356

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC 网络编程
c++c语言开发语言 技术论坛(原bbs)
社区管理员
  • 网络编程
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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