求教Xtang有关网络驱动模块的问题。

Xtang先生:
你好!
我想做截获传送到本机的网络数据包的程序,我第一步想先把截获的数据包保存在一个文件中,看看截获的数据包的内容是什么,我的代码如下:

static int filter_rx_up(npkt_t *npkt, void *func_hdl, int
off, int len_sub, uint16_t cell, uint16_t endpoint,
uint16_t iface)
{
net_buf_t *buf;
net_iov_t *iov;
FILE *fp = NULL;

fp = fopen( “/home/dcp/Data_Log/net_data”, “w” );
if( fp == NULL )
{
perror(“open signal_log file error!\n”);
exit( 0 );
}
fflush( fp );

for(buf=TAILQ_FIRST(&npkt->buffers);buf;buf=TAILQ_NEXT(buf,ptrs))
{
for(j=0,iov=buf->net_iov;jniov;j++,iov++)
{
fwrite(iov->iov_base, iov->iov_len, 1, fp );
//fwrite(fp, (char *)iov->iov_base, iov->iov_len );
}
}
if( filter_ion->tx_up(filter_reg_hdl, npkt, off, len_sub,
cell, endpoint, iface) <= 0 )
{
filter_ion->tx_done(filter_reg_hdl, npkt);
}

return 0;
}


我建立了一个net_data文件,用fwrite(iov->iov_base, iov->iov_len, 1, fp );将截获到的数据包的内容写到该文件,可是当我把这个网络驱动模块加载到io-net后,运行一段时间,文件里面什么内容也没有。而且,有时候将这个网络驱动模块加载到io-net后,这台机子就会与其它机子的通信就会中断。连接不到其它的机子。ping自己的IP也不通。请问这是怎么回事?

我在网上问,有朋友让我用fwrite(fp, (char *)iov->iov_base, iov->iov_len );试试,可用这样,编译出错。

请Xtang先生帮忙看看,给点指点吧。这个问题困了我很长时间了。

filter_rx_up() 每有一个包进来都会被调用一次。

也就是说,每一个包,你都会fopen()一次,每一次fopen()都会把文件指针置零。应该把fopen()拿到只执行一次的初始化函数中去。

另外,我印象里fopen()/fwarite()是会缓存的,没有fclose()可能不最后写会文件中去。改用open()/write()吧。