【问题标题】:Making udp socket non-blocking使 udp 套接字非阻塞
【发布时间】:2013-05-04 08:15:39
【问题描述】:

我一直在研究非阻塞 udp 套接字。每当有任何数据要通过套接字读取时,我开发的代码都会生成一个窗口消息。下面是代码sn-p:

void createSocket(HWND hwnd)
{
   ///Socket Binding///
   WSADATA wsa; 
   ///Initialise winsock///
   if (WSAStartup(MAKEWORD(2,2),&wsa) != 0)
      {
         exit(EXIT_FAILURE);
      }

   ///Create a socket///
   if((socketIdentifier = socket(AF_INET , SOCK_DGRAM , 0 )) == INVALID_SOCKET)
      {                 
         //Socket Creation Failed
      }
   ///Socket Created///

   ///Prepare the sockaddr_in structure///
   serverSocket.sin_family = AF_INET;
   serverSocket.sin_addr.s_addr = INADDR_ANY;
   serverSocket.sin_port = htons( PORT );

   ///Bind///
   if( bind(socketIdentifier ,(struct sockaddr *)&serverSocket , sizeof(serverSocket)) == SOCKET_ERROR)
      {     
         //Bind Failed      
      }

    WSAAsyncSelect (socketIdentifier, hwnd, MY_MESSAGE_NOTIFICATION, FD_READ | FD_CONNECT | FD_CLOSE | FD_ACCEPT); //Set
   ///Bind Done///

}

LRESULT CALLBACK WndProc(HWND hwnd, UINT msg, WPARAM wParam, LPARAM lParam);    
int WINAPI WinMain(  HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nShowCmd 
{
   //Window Created
   createSocket() //Socket Created
   while(GetMessage(&Msg, NULL, 0, 0) > 0)  //Check on Window Messages
      {         
         TranslateMessage(&Msg);
         DispatchMessage(&Msg);
      }
   return Msg.wParam;
}

LRESULT CALLBACK WndProc(HWND hwnd, UINT msg, WPARAM wParam, LPARAM lParam)
{
   switch(msg)
   {
    case MY_MESSAGE_NOTIFICATION: //Is a message being sent?
        {
      switch (lParam) //If so, which one is it?
            {
            case FD_ACCEPT:
                //Connection request was made
                break;

            case FD_CONNECT:
                //Connection was made successfully
                break;

            case FD_READ:
               receiveAtSocket();
            break;

            case FD_CLOSE:
                //Lost the connection
             break;
            }
        }
        break;
   }
}

这段代码运行良好,socket 不必等待调用 snedto() 或 recvfrom()。相反,只要数据准备好在套接字上读取或写入,就会生成一个窗口消息。

现在,我想找到一些其他方式来通知数据数据已准备就绪,而不是窗口消息。即,只要套接字上有要读取或写入的数据,我不希望生成任何窗口消息。

有没有其他方法可以在不使用窗口消息的情况下实现上述功能>请帮助我。

等待帮助:(

【问题讨论】:

  • 你为什么不想要窗口消息?

标签: c windows sockets asynchronous udp


【解决方案1】:

另一种方法是使用 WaitForSingleObject 或 WaitForMultipleObjects 或它们的兄弟。你可以在这里看到一些代码:Asynchronous winsock server wrapper, CPU lagging - C++

【讨论】:

  • 感谢您的发帖。我现在正在尝试使我的套接字“基于事件”。以下是我尝试过的:WSAEVENT NewEvent = WSACreateEvent(); WSAEventSelect(socketIdentifier, NewEvent, FD_READ | FD_WRITE);我不知道如何继续。我在互联网上找到的所有示例都是针对多个套接字的。但是,就我而言,我只有一个套接字,我想让它“事件驱动”以进行读写。请帮我。我被卡住了!
  • 如果您找到适用于多个套接字的代码,您肯定也可以将其用于一个套接字吗?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2011-09-12
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多