1. 程式人生 > >UDP bind給出的錯誤提示10022

UDP bind給出的錯誤提示10022

要求是:裝置與主機之間是UDP通訊,當重新整理裝置時,需要釋放socket資源,然後再新建socket資源。(沒有設定socket的地址重用屬性,因為要防止會帶來其他的隱患,比方說接收到舊的錯誤訊息)

sock為類成員變數

port也為類成員變數

(一些錯誤校驗都省略了)

第一個版本:

bool InitSocket()

{

     sock = socket(AF_INET, SOCK_DGRAM, 0);

     SOCKADDR_IN sockSrc;
      sockSrc.sin_family = AF_INET;
      sockSrc.sin_port = htons(port);
      sockSrc.sin_addr.S_un.S_addr = htonl(INADDR_ANY);
      int times = 0;
      while(times < 1000000 && SOCKET_ERROR == bind(sock, (SOCKADDR *)&sockSrc, sizeof(SOCKADDR)))

     {
           qDebug("CanThread: Bind socket error! Reason %d", WSAGetLastError());
           times++;
           Sleep(200);

    }

}

繫結說明:對於繫結經常會給出10048錯誤提示,在此時的情況下,出現10048的原因是在釋放socket資源後系統沒有真正的立即釋放掉,此時繫結就會出現10048這個錯誤。系統真正的釋放時間應該在2~4分鐘。

第二個版本:

typedef sturct tag_UDP_SOCKET_PORT

{

       SOCKET sock;

      int port;

}UDP_SOCKET_PORT;

DWORD WINAPI bindUDPThread(LPVOID lpParam)

{

      UDP_SOCKET_PORT *usp = (UDP_SOCKET_PORT*)lpParam;

     SOCKADDR_IN sockSrc;
       sockSrc.sin_family = AF_INET;
       sockSrc.sin_port = htons(usp->port);
       sockSrc.sin_addr.S_un.S_addr = htonl(INADDR_ANY);
       int Ret;
       while(1)

       {
            Ret = bind(usp->sock, (SOCKADDR *)&sockSrc, sizeof(SOCKADDR));
            if(SOCKET_ERROR == Ret)

           {
                 int tmpRet = WSAGetLastError();
                 qDebug("Bind Socket Error!Reason:%d,port = %d",WSAGetLastError(),port);
            }
            else
            {
                 break;
            }
            Sleep(2000);
   }

      delte lpParam;

      return 0;

}

bool InitSocket()

{

     sock = socket(AF_INET, SOCK_DGRAM, 0);

     SOCKADDR_IN sockSrc;
      sockSrc.sin_family = AF_INET;
      sockSrc.sin_port = htons(port);
      sockSrc.sin_addr.S_un.S_addr = htonl(INADDR_ANY);
      int times = 0;
      while(times < 10 && SOCKET_ERROR == bind(sock, (SOCKADDR *)&sockSrc, sizeof(SOCKADDR)))

     {
           qDebug("CanThread: Bind socket error! Reason %d", WSAGetLastError());
           times++;
           Sleep(200);

    }

    if(times >= 10)

    {

                 //當十次沒有繫結成功的話,就開啟一個執行緒專門用於繫結

          UDP_SOCKET_PORT *usp = new UDP_SOCKET_PORT;

         usp->sock = sock;

         usp->port = port;

           CreateThread(NULL,0,bindUDPThread,usp,NULL,NULL);

    }

}

疑問:

第一個版本中輸出的錯誤提示總是10048

第二個版本中,新建的執行緒卻給出10022,搞不懂。。。