UDPRecv::run应该消除一些不必要的操作
UDPRecv::run用于接收udp消息,存在以下不必要的操作:
- m_iSockFD是阻塞的fd,recvfrom自然就会阻塞等待数据可读。这样就没必要在recvfrom之前加poll等待数据可读。
- 代码没有使用地址结构addr的地方,所以recvfrom没必要获取地址结构addr。
原代码路径:
src/communicate/udp.cpp
void UDPRecv :: run()
{
m_bIsStarted = true;
char sBuffer[65536] = {0};
struct sockaddr_in addr;
socklen_t addr_len = sizeof(struct sockaddr_in);
memset(&addr, 0, sizeof(addr));
while(true)
{
if (m_bIsEnd)
{
PLHead("UDPRecv [END]");
return;
}
// m_iSockFD是阻塞的fd,recvfrom自然就会阻塞等待数据可读。这样就没必要在recvfrom之前加poll等待数据可读
struct pollfd fd;
int ret;
fd.fd = m_iSockFD;
fd.events = POLLIN;
ret = poll(&fd, 1, 500);
if (ret == 0 || ret == -1)
{
continue;
}
// 代码没有使用地址结构addr的地方,所以recvfrom没必要获取地址结构addr
int iRecvLen = recvfrom(m_iSockFD, sBuffer, sizeof(sBuffer), 0,
(struct sockaddr *)&addr, &addr_len);
//printf("recvlen %d, buffer %s client %s\n",
//iRecvLen, sBuffer, inet_ntoa(addr.sin_addr));
BP->GetNetworkBP()->UDPReceive(iRecvLen);
if (iRecvLen > 0)
{
m_poDFNetWork->OnReceiveMessage(sBuffer, iRecvLen);
}
}
}
修改后的代码路径:
src/communicate/udp.cpp
void UDPRecv :: run()
{
m_bIsStarted = true;
char sBuffer[65536] = {0};
// 删除代码
/*
struct sockaddr_in addr;
socklen_t addr_len = sizeof(struct sockaddr_in);
memset(&addr, 0, sizeof(addr));
*/
while(true)
{
if (m_bIsEnd)
{
PLHead("UDPRecv [END]");
return;
}
// 删除代码
/*
struct pollfd fd;
int ret;
fd.fd = m_iSockFD;
fd.events = POLLIN;
ret = poll(&fd, 1, 500);
if (ret == 0 || ret == -1)
{
continue;
}
*/
/*
int iRecvLen = recvfrom(m_iSockFD, sBuffer, sizeof(sBuffer), 0,
(struct sockaddr *)&addr, &addr_len);
*/
// 修改代码
int iRecvLen = recvfrom(m_iSockFD, sBuffer, sizeof(sBuffer), 0,
NULL, NULL);
//printf("recvlen %d, buffer %s client %s\n",
//iRecvLen, sBuffer, inet_ntoa(addr.sin_addr));
BP->GetNetworkBP()->UDPReceive(iRecvLen);
if (iRecvLen > 0)
{
m_poDFNetWork->OnReceiveMessage(sBuffer, iRecvLen);
}
}
}
UDPRecv::run应该消除一些不必要的操作
UDPRecv::run用于接收udp消息,存在以下不必要的操作:
原代码路径:
src/communicate/udp.cpp
修改后的代码路径:
src/communicate/udp.cpp