2016-10-05 12 views
0

서버 Windows Form 응용 프로그램을 만들려고하지만 Listen 메서드를 호출 할 때 코드에서 0x80004005 오류가 발생합니다. 내가 뭘 잘못하고있어?이 코드를 UDP 포트에서 수신 대기하도록 변경해야하는 사항은 무엇입니까?

Private Sub StartUdpReceiveThread(ByVal Puerto As Integer) 
    If Not UdpOpen Then 
     Try 
      permission = New SocketPermission(NetworkAccess.Accept, TransportType.Udp, "", SocketPermission.AllPorts) 

      sListener = Nothing 

      permission.Demand() 

      'Dim ipHost As IPHostEntry = Dns.GetHostEntry("") 

      Dim ipAddr As IPAddress = IPAddress.Any 

      ipEndPoint = New IPEndPoint(ipAddr, CInt(Me.PuertoEscuchaLbl.Text)) 

      'sListener = New Socket(ipAddr.AddressFamily, SocketType.Unknown, ProtocolType.Udp) 
      sListener = New Socket(ipAddr.AddressFamily, SocketType.Dgram, ProtocolType.UDP) 

      ' Associates a Socket with a local endpoint 
      sListener.Bind(ipEndPoint) 

      sListener.Listen(5) 

      ' Begins an asynchronous operation to accept an attempt 
      Dim aCallback As New AsyncCallback(AddressOf AcceptCallback) 
      sListener.BeginAccept(aCallback, sListener) 

      PrintLog("Server listening on " & ipEndPoint.Address.ToString & " port: " & ipEndPoint.Port) 

      UdpOpen = True 
     Catch ex As Exception 
      MessageBox.Show(ex.ToString()) 
     End Try 
    End If 
End Sub 

편집 : 콜백 방법 공공 하위 AcceptCallback (AR 된 IAsyncResult로) 소켓 = 아무것도으로 희미한 리스너

' A new Socket to handle remote host communication 
    Dim handler As Socket = Nothing 
    Try 
     ' Receiving byte array 
     Dim buffer As Byte() = New Byte(1023) {} 
     ' Get Listening Socket object 
     listener = DirectCast(ar.AsyncState, Socket)'<-- Here raises an error 
     ' Create a new socket 
     handler = listener.EndAccept(ar) 

     handler.NoDelay = False 

     ' Creates one object array for passing data 
     Dim obj As Object() = New Object(1) {} 
     obj(0) = buffer 
     obj(1) = handler 

     handler.BeginReceive(buffer, 0, buffer.Length, SocketFlags.None, New AsyncCallback(AddressOf ReceiveCallback), obj) 

     ' Begins an asynchronous operation to accept an attempt 
     Dim aCallback As New AsyncCallback(AddressOf AcceptCallback) 
     listener.BeginAccept(aCallback, listener) 
    Catch ex As Exception 
     MessageBox.Show(ex.ToString()) 
    End Try 
End Sub 

답변

0

단지 IPHostEntry.AddressList의 첫 번째 IP 주소를 선택하지만 배열을 검색하지 마십시오 IPv4 주소의 경우. this MSDN page의 예를 참조하십시오.

+0

ipAddr 변수를 정의하는 줄을 Dim ipAddr로 변경합니다. IPAddress = System.Net.IPAddress.Parse ("127.0.0.1")로 작동하지만 TCP 포트가 열리고 UDP 포트가 필요합니다. : –

+0

'SocketType.Dgram'과'ProtocolType.UDP'를 사용하는 경우에도? – rveerd

+0

고마워!, Listen 메서드를 호출 할 때까지 변경되어 Listen 메서드가 UDP에 사용할 수 없기 때문에 오류가 발생합니다. 일부는 인터넷에 있고 UDP에 대한 수신 모드에서 소켓을 넣는 프로세스처럼 보이지만 TCP 서버를 기반으로이 코드를 작성합니다. 이제 BeginAccept 메서드로 대신 시도하지만 CallBack에 오류가 발생합니다. EndAccept 메서드가 asyncResult를 반환하지 않습니다. –

관련 문제