2016-08-30 2 views
0

VB.net에서 배포하려는 과학 소프트웨어를 개발 중입니다. 응용 프로그램의 일부에는 서버 (및 기타 클라이언트)와의 통신이 포함됩니다. 모든 의도와 목적을 위해 통신은 채팅 응용 프로그램과 같을 것입니다.TCP/IP 메시징 응용 프로그램 VB.net - IP 주소/포트 전달 질문

저는 소켓을 사용하여 소프트웨어를 개발했으며 로컬 네트워크에서 집에서 테스트 할 때 잘 작동합니다. 아래는 내가 메시지를 보내는 방법 기본적으로 :

Dim serverIPString as String = "192.168.1.5" 
Dim serverPort as long = 65500 
dim messageString as String = "Hello" 
Dim Client As New System.Net.Sockets.TcpClient(serverIPString, serverPort) 
Dim Writer As System.IO.StreamWriter(Client.GetStream()) 

Writer.Write(messageString) 
Writer.Flush() 
Writer.Close() 

을 그리고 이것은 내가 듣는 방법입니다

Public Class TCPIPListener 
    Dim initalised As Boolean = False 
    Dim port As Long 
    Dim IP As System.Net.IPAddress 
    Dim ourListener As TcpListener 
    Dim ourClient As TcpClient 
    Dim ourMessage As String 

    ''''''''''' 
    '' ctors '' 
    ''''''''''' 

    Public Sub New() 
     initalised = False 
    End Sub 

    'Takes IP and port and starts listeing 
    Public Sub New(inIP As String, inPort As Long, inExchange As messageExchange) 
     'Try to set the IP 
     Try 
      IP = System.Net.IPAddress.Parse(inIP) 
     Catch ex As Exception 
      Exit Sub 
     End Try 

     'Set the port 
     port = inPort 

     initalised = startListener() 

    End Sub 

    ''''''''''''''' 
    '' Listening '' 
    ''''''''''''''' 

    Private Sub Listening() 
     ourListener.Start() 
    End Sub 

    'starts listener 
    Public Function startListener() As Boolean 
     ourListener = New TcpListener(IP, port) 
     ourClient = New TcpClient() 

     Dim ListenerThread As New Thread(New ThreadStart(AddressOf Listening)) 
     ListenerThread.Start() 

     initalised = True 

     Return True 
    End Function 

    'Called from a timer on the form 
    Public Function tick() As Boolean 
     If Not initalised Then 
      Return False 
     End If 

     If ourListener.Pending = True Then 
      ourMessage = "" 

      ourClient = ourListener.AcceptTcpClient() 

      Dim Reader As New System.IO.StreamReader(ourClient.GetStream()) 
      While Reader.Peek > -1 
       ourMessage = ourMessage + Convert.ToChar(Reader.Read()).ToString 
      End While 

      messagebox(ourMessage) 
     End If 

     Return True 
    End Function 
End Class 

, 모든 클라이언트가 서버에서 전송 된 메시지를 수신한다이 방법을 사용하고 메시지를 보낼 것입니다 서버로 이동하여 관련 클라이언트에게 지시하십시오. 소프트웨어가 작동하는 방식에는 다소 비효율적이지만 필요합니다.

문제는 인터넷에서이 문제가 발생하는 데 문제가 있다는 것입니다. 로컬 IP 주소로 메시지를 보내면 디버거에서도 제대로 작동합니다.

No connection could be made because the target machine actively refused it XXX.XXX.XXX.XXX:65500"

내 라우터 포트 포워딩 설정 했더니 PC 리스터를 실행에 전달하는 올바른 포트 (여기 65500)를 설정 한 (192.168.1.5 : 나는 외부 IP 주소를 사용하는 경우 나는 다음과 같은 수) TCP와 UDP 둘 다. This 웹 사이트에서는이 포트가 열려 있다고 말하며 양 측면은 개방되어 있지 않습니다.

exe를 마우스 오른쪽 버튼으로 클릭하고 관리자 권한으로 실행하면 내 바이러스 백신이 튀어 나와 청취자를 시작할 때 의심스러운 일을한다고 말합니다. 내 응용 프로그램을 예외 목록에 추가 한 다음 다시 실행하면 포트가 수신 대기 중인지 확인하십시오 (this 사용) 응용 프로그램이 올바른 포트에서 수신 대기중인 경우 (응용 프로그램을 중지하면 해당 포트가 사라짐) 찾습니다. 그러나 클라이언트 응용 프로그램은 여전히 ​​위의 동일한 오류를 제공합니다. 청취자가 아닌 임의의 IP 주소를 사용하면 다른 오류가 발생합니다.

{"A connection attempt failed because the connected party did not properly respond after a period of time, or established connection failed because connected host has failed to respond XXX.XXX.XXX.XXX:65500"}

나는이 문제에 대한 올바른 접근 방법을 취하지 않을 것으로 생각합니다. 나는 VB의 대부분의면에서 문제가 없지만 전에 이런 종류의 문제를 다루지 않았다. 소프트웨어를 배포 할 때 내 고객이이 응용 프로그램을 작동시킬 수 있도록 깊은 설정을해야합니다. 어떤 도움이 내게 대단히 유용 할 것입니다!

또 다른 문제는 여러 클라이언트가 동일한 외부 IP를 가지고 있지만 내부 IP가 서로 다른 경우입니다 (대학에 배포하려고합니다). 이러한 상황에서 나는 포트 포워딩이 작동하지 않을 것 같아요.

대단히 감사드립니다. (긴 게시물에 사과드립니다!)

+0

연결을 시작한 클라이언트는 임의의 ethereal 포트 중 하나를 소스 포트로 사용해야합니다. 서버에만 정의 된 포트 번호가 있어야합니다. 클라이언트가 TCP 연결을 설정하면 응용 프로그램이 클라이언트에서 종료 될 때까지 연결을 유지해야합니다. TCP는 피어의 양방향 연결입니다 (클라이언트 또는 서버가 없으며 TCP와 관련이없는 응용 프로그램 개념 임). 이렇게하면 양방향으로 포트 포워드가 필요하다는 문제를 피할 수 있으며 한 NAT 주소 뒤에있는 여러 클라이언트의 문제를 해결할 수 있습니다. –

+0

감사합니다. 그래,이게 의미가있어. TcpClient를 연결할 때 저장할 수 있습니다. 이것은 문제의이 부분을 적어도 해결합니다. – Johnboydump

답변

0

192.168.1.5에서 연결을 수신 대기하도록 서버를 설정하면 해당 특정 IP 주소의 연결 만 허용됩니다 (). TcpListener으로 지정한 주소는 연결을 수락 할 IP 주소입니다.

주소가 192.168.1.5이므로 주소가 내부적이므로 네트워크 외부의 어느 누구도 서버에 연결할 수 없습니다. 서버가 누군가의 연결을 허용하도록 0.0.0.0 (또는 그에 상응하는 IPAddress.Any)을 수신 대기하도록합니다.

관련 문제