簡體   English   中英

使udp套接字無阻塞

[英]Making udp socket non-blocking

我一直在非阻塞udp套接字上工作。 每當通過套接字讀取任何數據時,我開發的代碼都會生成一個窗口消息。 下面是代碼片段:

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;
   }
}

這段代碼可以正常工作,套接字不必等待snedto()或recvfrom()的調用。 相反,只要准備好在套接字上讀取或寫入數據,就會生成窗口消息。

現在,我想找出其他方法來通知數據數據已准備就緒,而不是窗口消息。 即我不希望任何時候在套接字上讀取或寫入數據時生成任何窗口消息。

在不使用“窗口消息”的情況下,還有其他方法可以實現上述功能嗎?請幫助我。

等待幫助:(

另一種方法是使用WaitForSingleObject或WaitForMultipleObjects或其兄弟。 您可以在此處看到一些執行此操作的代碼: 異步winsock服務器包裝程序,CPU滯后-C ++

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM