2017-07-07 145 views
0

目標是windows和linux之間的vb.net連接。在Linux上使用VB.net進行Windows TCP套接字連接

windows-server(vb.net):服務器應該在端口4001/tcp上監聽連接,並對數據包執行一些操作。

Dim serverstream As NetworkStream 
Dim serverstreamw As StreamWriter 
Dim serverstreamr As StreamReader 
Dim Server As TcpListener 
Dim serverclient As New TcpClient 
Dim ipendpoint As IPEndPoint = New IPEndPoint(IPAddress.Any, 4001) 
Dim mainthread As Threading.Thread 

Private Sub Form1_Load(sender As Object, e As EventArgs) Handles MyBase.Load 
    mainthread = New Threading.Thread(AddressOf mainserver) 
    mainthread.Start() 
End Sub 

Sub mainserver() 
    Try 
     Server = New TcpListener(ipendpoint) 
     Server.Start() 
     serverclient = Server.AcceptTcpClient 
     serverstream = serverclient.GetStream 
     serverstreamr = New StreamReader(serverstream) 
     serverstreamw = New StreamWriter(serverstream) 
     While True 
      Select Case serverstreamr.ReadLine 
       Case "onl" '........ 
       Case "logoff" '........ 
       Case "iamhere" '........ 
        MessageBox.Show("WORKS!!!") 
      End Select 
     End While 
    Catch 

    End Try 
End Sub 

Linux的客戶端:客戶端應該創建與服務器的連接併發送數據包他。

echo "iamhere" > /dev/tcp/client.ip/4001 

的問題是,它似乎像服務器不開端口4001/TCP。客戶端沒有連接:/

如何解決這個問題?

+0

您是通過局域網還是通過互聯網連接?如果是後者,則必須在路由器中轉發端口4001。此外,我沒有看到你指定什麼IP連接_ **到** _在Linux上。 –

+0

互聯網。除了轉發之外,沒有別的辦法嗎?如何遊戲處理這個? U不要轉發你的路由器中的每個端口:) – realKSMC

+0

'IPAddress.Any'表示監聽所有連接,不是嗎?所以它需要監聽所有IP的各種客戶端的bc :) – realKSMC

回答

1

連接不起作用的原因是因爲您必須在服務器的路由器中使用forward port 4001。目前它由路由器丟棄,因爲該端口未映射到路由器的NAT表中,所以路由器不知道應該向哪個LAN設備發送該數據包。

至於只被顯示一次,如果你那Linux的代碼創建一個 TCP連接的消息框,然後你必須改變你的代碼收到消息後,丟棄舊的連接:

Try 
    Server = New TcpListener(ipendpoint) 
    Server.Start() 
    While True 'Moved While up here to wait for new connections after every command. 
     serverclient = Server.AcceptTcpClient 
     serverstream = serverclient.GetStream 
     serverstreamr = New StreamReader(serverstream) 
     serverstreamw = New StreamWriter(serverstream) 
     Select Case serverstreamr.ReadLine 
      Case "onl" '........ 
      Case "logoff" '........ 
      Case "iamhere" '........ 
       MessageBox.Show("WORKS!!!") 
     End Select 
     serverclient.Close() 'Close old connection. 
    End While 
Catch 
End Try 

我們這樣做的原因是因爲如果Linux啓動一個新的連接而服務器不啓動,那麼服務器仍然會等待舊的連接上的數據,而這些數據已不再由Linux使用。

+0

夢幻般的:) Thx爲你的時間。沒想到這很簡單......只是端口轉發。我真的很感謝你的回答;) – realKSMC

+1

@realKSMC:很高興我能幫忙!請記住,如果您有時間連接使用_ **相同​​* _連接的客戶端,您必須將您的代碼返回到以前的狀態。 - 祝你好運! –

+0

做例如新遊戲隧道的端口連接,以便不需要在路由器端口轉發?客戶端也從服務器接收數據包。 – realKSMC