udP socket CPU居高不下?

啥时候能毕业啊 2018-01-19 08:34:00
bool prepareUDP()
{
int buffsize = 1024*1024;
unsigned long nFlag = 1;

m_sokVideoSocket = socket(AF_INET, SOCK_DGRAM, 0);
BOOL fReuse = true;
if (SOCKET_ERROR == setsockopt(m_sokVideoSocket, SOL_SOCKET, SO_REUSEADDR, (const char*)&fReuse, sizeof(BOOL)))
{
closesocket(m_sokVideoSocket);
m_sokVideoSocket = INVALID_SOCKET;
}

if (SOCKET_ERROR == setsockopt(m_sokVideoSocket, SOL_SOCKET, SO_RCVBUF, (char*)&buffsize, sizeof(int)))
{
closesocket(m_sokVideoSocket);
m_sokVideoSocket = INVALID_SOCKET;
}
if (SOCKET_ERROR == ioctlsocket(m_sokVideoSocket, FIONBIO, &nFlag))
{
closesocket(m_sokVideoSocket);
m_sokVideoSocket = INVALID_SOCKET;
}

sockaddr_in stSokAddr = { 0 };
int nSokStLen = sizeof(sockaddr);
//stSokAddr.sin_addr.S_un.S_addr = inet_addr(localIP);
stSokAddr.sin_addr.S_un.S_addr = INADDR_ANY;
stSokAddr.sin_port = htons(port);
stSokAddr.sin_family = AF_INET;

if (SOCKET_ERROR == bind(m_sokVideoSocket, (sockaddr *)&stSokAddr, nSokStLen))
{
//TRACE("m_sokVideoData bind port %d \n ", port);
closesocket(m_sokVideoSocket);
m_sokVideoSocket = INVALID_SOCKET;
return false;
}

return true;

}

static int recvData(void* ptr)
{

int nDataLen = 0;
char* szDataBuf = new char[65536];
memset(szDataBuf, 0, 65536);

int nSokStLen = sizeof(sockaddr);

fd_set stSocketSet;
timeval stTimeOut;
stTimeOut.tv_sec = 3;
stTimeOut.tv_usec = 0;
while (player->m_continuRcv)
{
FD_ZERO(&stSocketSet);

if (m_sokVideoSocket != INVALID_SOCKET)
{
FD_SET(m_sokVideoSocket, &stSocketSet);
}

//if (select(0, &stSocketSet, NULL, NULL, &stTimeOut) > 0)
{
// if (FD_ISSET(m_sokVideoSocket, &stSocketSet))
{
//SOCKADDR_IN remoteAddr;
// int nAddrLen = sizeof(remoteAddr);
//nDataLen = recvfrom(m_sokVideoSocket, (char*)szDataBuf, 65536, 0, (SOCKADDR*)&remoteAddr, &nAddrLen); //BUF_SIZE
nDataLen = recv(m_sokVideoSocket, (char*)szDataBuf, 65536, 0);
if (nDataLen > 12)
{
//processUDPDate(szDataBuf, nDataLen);
}
printf("%d\n",nDataLen);
}
}
//else
{
std::this_thread::sleep_for(std::chrono::milliseconds(1));//milliseconds nanoseconds
}

}
return 0;
}

int main()
{
if(prepareUDP)
{
std::thread t(recvData,nullptr);
t.detach();
}
}

尝试了各种,阻塞非阻塞,各种超时尝试,select,recv,sleep,cpu依然居高不下,求哪位大神帮看下
...全文
679 4 打赏 收藏 转发到动态 举报
写回复
用AI写文章
4 条回复
切换为时间正序
请发表友善的回复…
发表回复
xian_wwq 2018-01-22
  • 打赏
  • 举报
回复
while循环中没有sleep 就相当于人为制造了个死循环
  • 打赏
  • 举报
回复
感谢各位的回复,问题已经解决,不是同步异步的问题,也不是sleep的问题,代码中有sleep函数, std::this_thread::sleep_for(std::chrono::milliseconds(1));// 因为该线程是处理码流所以不能加sleep,代码中的sleep只是测试来调整cpu利用率的。cpu高是数据处理的问题,不是网络收发的原因。
draculamx 2018-01-20
  • 打赏
  • 举报
回复
你使用了异步通信,所以你的 recvfrom 函数,不会等待,立即反悔 有三个选项: 1.给你的UDP设置超时选项 2.将你的UDP设置为同步 3.在你的 while (player->m_continuRcv) { Sleep(20); } 加个等待时间,甚至是Sleep(1)都可以,然后你就可以看到你的CPU占用会下降
hrtem 2018-01-19
  • 打赏
  • 举报
回复
为什么要绑定呢

18,356

社区成员

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

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