Skip to content
  • Categories
  • Recent
  • Tags
  • Popular
  • World
  • Users
  • Groups
Skins
  • Light
  • Cerulean
  • Cosmo
  • Flatly
  • Journal
  • Litera
  • Lumen
  • Lux
  • Materia
  • Minty
  • Morph
  • Pulse
  • Sandstone
  • Simplex
  • Sketchy
  • Spacelab
  • United
  • Yeti
  • Zephyr
  • Dark
  • Cyborg
  • Darkly
  • Quartz
  • Slate
  • Solar
  • Superhero
  • Vapor

  • Default (No Skin)
  • No Skin
Collapse
Code Project
  1. Home
  2. General Programming
  3. C / C++ / MFC
  4. Need solution for WSAEWOULDBLOCK

Need solution for WSAEWOULDBLOCK

Scheduled Pinned Locked Moved C / C++ / MFC
helpdebugging
2 Posts 2 Posters 0 Views 1 Watching
  • Oldest to Newest
  • Newest to Oldest
  • Most Votes
Reply
  • Reply as topic
Log in to reply
This topic has been deleted. Only users with topic management privileges can see it.
  • Y Offline
    Y Offline
    yaminisridaran
    wrote on last edited by
    #1

    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,

    M 1 Reply Last reply
    0
    • Y yaminisridaran

      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,

      M Offline
      M Offline
      Mark Salsbery
      wrote on last edited by
      #2

      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:

      1 Reply Last reply
      0
      Reply
      • Reply as topic
      Log in to reply
      • Oldest to Newest
      • Newest to Oldest
      • Most Votes


      • Login

      • Don't have an account? Register

      • Login or register to search.
      • First post
        Last post
      0
      • Categories
      • Recent
      • Tags
      • Popular
      • World
      • Users
      • Groups