2017-07-07 108 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