Need solution for WSAEWOULDBLOCK
-
I am trying to receive asynchronous sockets via udp but I am mostly getting WSAEWOULDBLOCK error . I anyone help me solving this problem WSADATA wsaData; int error = WSAStartup(0x202,&wsaData); if(error) return FALSE; if(wsaData.wVersion != 0x202) { WSACleanup(); return FALSE; } m_UdpSock=(SOCKET)WSASocket(AF_INET,SOCK_DGRAM,0,NULL,NULL,0); if(m_UdpSock==INVALID_SOCKET) return FALSE; sockaddr_in sockAddrServer; sockAddrServer.sin_family=AF_INET; sockAddrServer.sin_port=htons(port_data); sockAddrServer.sin_addr.s_addr=INADDR_ANY; // Bind socket to listener address if(bind(m_UdpSock,(SOCKADDR*)&sockAddrServer,sizeof(sockaddr_in))==SOCKET_ERROR) { int y=WSAGetLastError(); printf("Unable to bind socket\n"); return FALSE; } // Create WinSock Event object WSAEVENT eventWinsock=(WSAEVENT)WSACreateEvent(); if(eventWinsock==WSA_INVALID_EVENT) { printf("Unable to create winsock event\n"); return FALSE; } // Signal WinSock Event on receive packet if(WSAEventSelect(m_UdpSock,eventWinsock,FD_READ)!=NOERROR) { printf("Unable to connect event to socket\n"); return FALSE; } //long length=50000; // m_Thread=new CManager((LPVOID)this); // m_Thread->CreateThread(); bool occurance=true; while(m_abort) { Recvbuf=new char[BUFFER_SIZE]; TRACE("Before Receive Data\n"); //if(WaitForSingleObject(eventWinsock,INFINITE)== WAIT_OBJECT_0) if(WaitForSingleObject(eventWinsock,INFINITE)== WAIT_OBJECT_0) { sockaddr_in sockAddrRecv; int nSockAddrSize=sizeof(sockaddr_in); // Packet received EnterCriticalSection(&m_cs); int nErr=recvfrom(m_UdpSock,Recvbuf,BUFFER_SIZE,0,(sockaddr*)&sockAddrRecv,&nSockAddrSize); LeaveCriticalSection(&m_cs); TRACE("Receive data\n"); if(nErr==SOCKET_ERROR) { TRACE("nErr %d\n",nErr); nErr=WSAGetLastError(); if(nErr==WSAEWOULDBLOCK) { WSAEventSelect(m_UdpSock,eventWinsock,FD_READ); WSANETWORKEVENTS wsevents; WSAEnumNetworkEvents(m_UdpSock,eventWinsock,&wsevents); DWORD dwEventId = WaitForSingleObject(eventWinsock,3000); if(dwEventId == WAIT_TIMEOUT) continue; continue; } else { WSAEventSelect(m_UdpSock,eventWinsock,FD_READ); WSANETWORKEVENTS wsevents; WSAEnumNetworkEvents(m_UdpSock,
-
I am trying to receive asynchronous sockets via udp but I am mostly getting WSAEWOULDBLOCK error . I anyone help me solving this problem WSADATA wsaData; int error = WSAStartup(0x202,&wsaData); if(error) return FALSE; if(wsaData.wVersion != 0x202) { WSACleanup(); return FALSE; } m_UdpSock=(SOCKET)WSASocket(AF_INET,SOCK_DGRAM,0,NULL,NULL,0); if(m_UdpSock==INVALID_SOCKET) return FALSE; sockaddr_in sockAddrServer; sockAddrServer.sin_family=AF_INET; sockAddrServer.sin_port=htons(port_data); sockAddrServer.sin_addr.s_addr=INADDR_ANY; // Bind socket to listener address if(bind(m_UdpSock,(SOCKADDR*)&sockAddrServer,sizeof(sockaddr_in))==SOCKET_ERROR) { int y=WSAGetLastError(); printf("Unable to bind socket\n"); return FALSE; } // Create WinSock Event object WSAEVENT eventWinsock=(WSAEVENT)WSACreateEvent(); if(eventWinsock==WSA_INVALID_EVENT) { printf("Unable to create winsock event\n"); return FALSE; } // Signal WinSock Event on receive packet if(WSAEventSelect(m_UdpSock,eventWinsock,FD_READ)!=NOERROR) { printf("Unable to connect event to socket\n"); return FALSE; } //long length=50000; // m_Thread=new CManager((LPVOID)this); // m_Thread->CreateThread(); bool occurance=true; while(m_abort) { Recvbuf=new char[BUFFER_SIZE]; TRACE("Before Receive Data\n"); //if(WaitForSingleObject(eventWinsock,INFINITE)== WAIT_OBJECT_0) if(WaitForSingleObject(eventWinsock,INFINITE)== WAIT_OBJECT_0) { sockaddr_in sockAddrRecv; int nSockAddrSize=sizeof(sockaddr_in); // Packet received EnterCriticalSection(&m_cs); int nErr=recvfrom(m_UdpSock,Recvbuf,BUFFER_SIZE,0,(sockaddr*)&sockAddrRecv,&nSockAddrSize); LeaveCriticalSection(&m_cs); TRACE("Receive data\n"); if(nErr==SOCKET_ERROR) { TRACE("nErr %d\n",nErr); nErr=WSAGetLastError(); if(nErr==WSAEWOULDBLOCK) { WSAEventSelect(m_UdpSock,eventWinsock,FD_READ); WSANETWORKEVENTS wsevents; WSAEnumNetworkEvents(m_UdpSock,eventWinsock,&wsevents); DWORD dwEventId = WaitForSingleObject(eventWinsock,3000); if(dwEventId == WAIT_TIMEOUT) continue; continue; } else { WSAEventSelect(m_UdpSock,eventWinsock,FD_READ); WSANETWORKEVENTS wsevents; WSAEnumNetworkEvents(m_UdpSock,
Has your code changed since I answered this a couple days ago? If you post code wrapped in pre tags, most of us would be much more inclined to read it. It appears you still have the same problem as a couple days ago.... the code is wrong. You're not using the event properly. You can simplify your code to something like this (pseudocode):
create/init/connect the socket
WSACreateEvent
WSAEventSelect
while(m_abort)
{
WaitForEvent
WSAEnumNetworkEvents (this will reset the event)
if read event
{
read a datagram, or loop reading datagrams until you get a WSAEWOULDBLOCK error
}
}You also probably want another event so you have a way to exit the loop if no data is received...
create/init/connect the socket
create an abort event
WSACreateEvent
WSAEventSelect
while(m_abort)
{
Wait For socket or abort Event (WaitForMultipleObjects)
if abort event
{
break;
}
else
{
WSAEnumNetworkEvents (this will reset the socket event)
if read event
{
read a datagram, or loop reading datagrams until you get a WSAEWOULDBLOCK error
}
}
}Mark Salsbery Microsoft MVP - Visual C++ :java: