socket中的阻塞和非阻塞
本帖最后由 oyljerry 于 2013-03-15 17:44:35 编辑 我用的UDP。
m_hSock = socket(AF_INET, SOCK_DGRAM, 0);
if(INVALID_SOCKET == m_hSock)
{
g_log.Write(_T("创建socket失败..."),GetLastError());
return FALSE;
}
//设置socket为非阻塞模式
u_long iMode = 1;
if (SOCKET_ERROR == ioctlsocket(m_hSock, FIONBIO, &iMode))
{
g_log.Write(_T("设置非阻塞socket失败..."),GetLastError());
return FALSE;
}
BOOL opt = TRUE;
setsockopt(m_hSock,SOL_SOCKET,SO_REUSEADDR, (char *)&opt,sizeof (opt));
g_log.Write(_T("socket为:"),m_hSock);
ZeroMemory(&m_AddrDst,sizeof(SOCKADDR_IN));
m_AddrDst.sin_family = AF_INET;
m_AddrDst.sin_addr.s_addr = inet_addr(m_IpAddress);
m_AddrDst.sin_port = htons(UDP_COMMON_PORT);
if (0 != connect(m_hSock,(sockaddr*)&m_AddrDst,sizeof(SOCKADDR_IN)))
{
g_log.Write(_T("连接socket失败..."),GetLastError());
return FALSE;
}
设置了socket为非阻塞。
然后我变开始发送信息和接收信息。
发送和接收信息的函数为:
BOOL UDP_Send(SOCKET nSocket,LPVOID lPdata,int nLen,sockaddr_in* addr)
{
int nSendLen = 0;
int nRet = 0;
while(nLen > nSendLen)
{
nRet = sendto(nSocket,(char*)lPdata+nSendLen,nLen - nSendLen,0,(sockaddr*)addr,sizeof(struct sockaddr_in));
if (SOCKET_ERROR == nRet)
{
if(10035 == GetLastError())
{
Sleep(2);
continue;
}
g_log.Write(_T("发送信息失败..."),GetLastError());
return FALSE;
}
nSendLen += nRet;
}
return TRUE;
}
BOOL UDP_Recv(SOCKET nSocket,LPVOID lPdata,int nLen,sockaddr_in* addr)
{
int nRecvLen = 0;
int nRet = 0;
int nAddLen = sizeof(struct sockaddr_in);
while (nLen > nRecvLen)
{
nRet = recvfrom(nSocket,(char*)lPdata+nRecvLen,nLen - nRecvLen,0,(sockaddr*)addr,&nAddLen);
if (SOCKET_ERROR == nRet)
{
if(10035 == GetLastError())
{
Sleep(2);
continue;
}
g_log.Write(_T("接收信息失败..."),GetLastError());
return FALSE;
}
nRecvLen += nRet;
}
return TRUE;
}
我在来个循环接收:
while(TRUE)
{
bRes = UDP_Recv(m_hSock,(char*)&Msg,sizeof(Msg),&sockAddr);
if (FALSE == bRes)
{
break;
}
if(NET_FLAG != Msg.dwNetFlag)
{
m_bRecv = FALSE;
break;
}
switch(Msg.dwCMD)
{
case NETCMD_NETWORK_DEVREBOOT_RESP:
m_bRecv = TRUE;
return;
case NETCMD_NETWORK_FACTORYRES_RESP:
m_bRecv = TRUE;
return;
case NETCMD_NETWORK_DEVPRARM_RESP:
m_bRecv = TRUE;
return;
case DEV_UDPMSG_DEVNTP_RESP:
m_bRecv = TRUE;
return;
default:
return;
}
}
bRes = UDP_Recv(m_hSock,(char*)&Msg,sizeof(Msg),&sockAddr);
if (FALSE == bRes)
{
break;
}
bRes = UDP_Recv(m_hSock,(char*)&Msg,sizeof(Msg),&sockAddr);
if (FALSE == bRes)
{
TRACE(_T("recieve nothing..."));
break;
}