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가 서로 다른 경우입니다 (대학에 배포하려고합니다). 이러한 상황에서 나는 포트 포워딩이 작동하지 않을 것 같아요.
대단히 감사드립니다. (긴 게시물에 사과드립니다!)
연결을 시작한 클라이언트는 임의의 ethereal 포트 중 하나를 소스 포트로 사용해야합니다. 서버에만 정의 된 포트 번호가 있어야합니다. 클라이언트가 TCP 연결을 설정하면 응용 프로그램이 클라이언트에서 종료 될 때까지 연결을 유지해야합니다. TCP는 피어의 양방향 연결입니다 (클라이언트 또는 서버가 없으며 TCP와 관련이없는 응용 프로그램 개념 임). 이렇게하면 양방향으로 포트 포워드가 필요하다는 문제를 피할 수 있으며 한 NAT 주소 뒤에있는 여러 클라이언트의 문제를 해결할 수 있습니다. –
감사합니다. 그래,이게 의미가있어. TcpClient를 연결할 때 저장할 수 있습니다. 이것은 문제의이 부분을 적어도 해결합니다. – Johnboydump