我的问题是使用rawsocket传递高速(大于50kpps)流量,两个线程,一个是发送(从缓冲区读取),另一个是接收(写入缓冲区)。
我必须使用while(1)循环来确保一个无限循环,从那以后我就不能使用usleep了,我会松包(我已经试过了)现在cpu使用率是100%,我想我是在消耗我的cpu。。。
代码如下:
while (1)
{
if (sendIndex == PACKET_COUNT_MAX)
{
sendIndex = 0;
}
else if (ringBuffer[sendIndex].drop == 0)
{if(sendtosocket (ringBuffer, sendIndex, rawout) < 0)
a++;
else
sendIndex++;}
else if (ringBuffer[sendIndex].drop == 1) {
ringBuffer[sendIndex].header.free = 1;
memset (ringBuffer[sendIndex].data, 0, sizeof (ringBuffer[sendIndex].data));
sendIndex++;
}
else
{
a++;
}
//nanosleep((struct timespec[]){{0, 5}}, NULL);
}
提前谢谢!!!!!!!
丽莎
最佳答案
您需要将控制权传递给内核您可能会发现有用的命令是select
查看http://manpages.courier-mta.org/htmlman2/select.2.html上的整个故事有关详细信息,http://www.gnu.org/software/libc/manual/html_node/Waiting-for-I_002fO.html。
一切都是因为你知道除了等待网络的输入,你别无选择或者文件系统或者其他任何文件描述符(U*ix行话)所以,一旦有东西要处理,就让内核唤醒你。