我有一台主PC和多个从属网络设备。主服务器使用fork为每个从服务器创建一个进程。每个进程都尝试连接到适当的设备并通过TCP捕获数据。
一切正常,但是我在主ubuntu-> kali(4.19.0-kali1-amd64)上重新安装,并且数据捕获停止
输入数据应在10-40Mb / s之间
分叉,从属和数据捕获似乎很好。如我所见,问题是fwrite。
如果我将fwrite更改为printf并将数据重定向到文件中,那么我将获取捕获的数据。
调试后有趣的注意事项:
一个线程的CPU总是100%
始终捕获16K数据
使用printf而不是fwrite,一切都很好。
还有一个有趣的注意事项:我认为这是一个不同的问题,但是我的网络界面看不到传入的软件包。已捕获,但不能用于netstat之类的统计信息。
while(1) { valread = read( sock , buffer, 1024); //blocking //printf("%s",buffer); //try with printf if (valread > 0) fwrite(buffer,1,valread,fp); //stuck? }
Barmar.. 5
当您收到EOF或错误时,循环不会停止,而只是继续尝试从套接字读取。
while(1) { valread = read( sock , buffer, 1024); if (valread > 0) { fwrite(buffer,1,valread,fp); } else if (valread <0) { perror("read from sock"); break; } else { break; } }
设备关闭网络连接时,将发生EOF。
如果套接字是非阻塞的,read()
可以返回-1
与ERRNO == EWOULDBLOCK
当没有什么随时阅读。您需要检查并打破循环(使用select()
或epoll()
等待套接字准备就绪,然后再尝试从中进行读取)。
顺便说一句,您不应使用printf()
,因为read()
不会在缓冲区中添加空终止符。
当您收到EOF或错误时,循环不会停止,而只是继续尝试从套接字读取。
while(1) { valread = read( sock , buffer, 1024); if (valread > 0) { fwrite(buffer,1,valread,fp); } else if (valread <0) { perror("read from sock"); break; } else { break; } }
设备关闭网络连接时,将发生EOF。
如果套接字是非阻塞的,read()
可以返回-1
与ERRNO == EWOULDBLOCK
当没有什么随时阅读。您需要检查并打破循环(使用select()
或epoll()
等待套接字准备就绪,然后再尝试从中进行读取)。
顺便说一句,您不应使用printf()
,因为read()
不会在缓冲区中添加空终止符。