当前位置: 技术问答>linux和unix
如何在单线程中通过socket同时实现数据包的收发?
来源: 互联网 发布时间:2015-12-12
本文导语: 是这样,我要测试一个嵌入式的CPU的内置网卡的实际最大收发包速度,修改了那个嵌入式CPU的内置网卡的驱动,让它每收到一个包后将该包的源和目的MAC地址交换然后立刻转发出去。然后用一个普通的Linux机器快速不...
是这样,我要测试一个嵌入式的CPU的内置网卡的实际最大收发包速度,修改了那个嵌入式CPU的内置网卡的驱动,让它每收到一个包后将该包的源和目的MAC地址交换然后立刻转发出去。然后用一个普通的Linux机器快速不断地给它发包。我现在需要再做一个在这个普通linux机器上用的收包程序,接收从那个嵌入式CPU的网卡转发回来的包。我本来的想法是起两个线程,一个发包一个收包,但是现在老板要求不能用多线程,当然更不能写两个程序了,要在一个程序里边实现收发包,而且还不能用多线程;另外,套接口的类型需要是SOCK_RAW。我现在有些晕了,不知道这样该怎么写,哪位了解的请指点小弟一下,最好能给个示例代码,多谢!
|
这种不用多线程实现收发的问题感觉上可以用定时器来解决,启动一个定时器,隔一段时间去socket中读取一次,而主函数可以不停的往外发送数据.即使用系统底层的中断机制来实现.
|
select
http://blog.csdn.net/bat603/archive/2006/08/25/1115993.aspx
最下面有关于这方面的介绍
select()函数将创建一个我们所关心的文件描述符表,它的参数将在内核中为这些文件描述符设置我们所关心的条件,例如是否是可读、是否可写以及是否异常,而且在参数中还可以设置我们希望等待的最大时间。在select()成功执行时,它将返回目前已经准备好的描述符数量,同时内核可以告诉我们各个描述符的状态信息。如果超时,则返回"0",如果出错,则函数返回"-1",并同时设置errno为相应的值。
http://blog.csdn.net/bat603/archive/2006/08/25/1115993.aspx
最下面有关于这方面的介绍
select()函数将创建一个我们所关心的文件描述符表,它的参数将在内核中为这些文件描述符设置我们所关心的条件,例如是否是可读、是否可写以及是否异常,而且在参数中还可以设置我们希望等待的最大时间。在select()成功执行时,它将返回目前已经准备好的描述符数量,同时内核可以告诉我们各个描述符的状态信息。如果超时,则返回"0",如果出错,则函数返回"-1",并同时设置errno为相应的值。
|
使用select pselect poll 或epoll。