【问题标题】:Is TCPClient usable without a network card?TCPClient没有网卡可以用吗?
【发布时间】:2015-06-02 09:58:56
【问题描述】:

我正在使用TCPClientTCPListener 在同一台计算机上运行的应用程序之间发送数据。我的目标是 Framework 4.5,所以如果我没记错的话,应用程序可以在 Windows Vista SP2 及更高版本上运行。 我为此使用了非常简单的代码:

客户:

 Try
    Using c = New Net.Sockets.TcpClient()
        c.Connect("localhost", 7643)
        If c.Connected Then

            Dim Specs As New List(Of Spectrum)
            ' Generating some data here to send

            Using stream = c.GetStream
                Dim xml As New Xml.Serialization.XmlSerializer(GetType(List(Of Spectrum)))
                xml.Serialize(stream, specs)
            End Using
        End If
    End Using
Catch sEx As Net.Sockets.SocketException
    MessageBox.Show("Could not send the data." & vbCrLf & _
                    "This can have multiple reasons:" & vbCrLf & _
                    "(i) The receiver is not running" & vbCrLf & _
                    "(ii) A firewall is blocking the connection")
Catch ex As Exception
    MessageBox.Show("An unexpected exception occured while sending the data: " & vbCrLf & _
                    ex.Message)
End Try

服务器:

Private Async Sub DoListen()
    Do
        Dim client = Await datagrabber.AcceptTcpClientAsync
        If client IsNot Nothing AndAlso client.Connected Then
            Dim t = Task.Run(Sub() HandleClient(client, Date.Now))
        End If
    Loop
End Sub

Private Sub HandleClient(client As Net.Sockets.TcpClient)
    Dim specs As New List(Of RelaxIS_Shared.CSSpectrum)
    Using stream = client.GetStream
        Dim ser As New System.Xml.Serialization.XmlSerializer(GetType(List(Of RelaxIS_Shared.CSSpectrum)))
        specs = CType(ser.Deserialize(stream), List(Of RelaxIS_Shared.CSSpectrum))
        client.Close()
    End Using

    ' Do stuff with data
End Sub

这很好用,但我开始怀疑这是否真的是一种在应用程序之间发送数据的聪明方法。例如,这是否总是在现代 Windows 机器上工作,或者如果有问题的计算机没有网卡怎么办?无论系统中的实际硬件如何,TCP 连接是否以某种方式虚拟化以在 localhost IP 上工作?

我找到了很多关于多个网卡的信息,但实际上没有关于没有网卡的信息。

我已经尝试在 Windows 中停用所有网络卡。在这种情况下它仍然有效,但是否总是如此,或者是否存在不允许使用 TCPClient 连接的硬件/软件配置?

我喜欢这个原理,因为它运行起来非常流畅,而且比共享文件更简洁。我对 Windows Communication Framework 之类的东西没有经验,因此坚持使用我最初知道的方法。

如果需要代码,我们非常感谢 C# 或 VB.NET 中的两个答案。


简短更新:根据下面 usr 接受的答案,我已经使用命名管道实现了通信。它基本上是相同的代码,它工作完美无瑕,绝对值得任何可能发现自己与我处于相同位置的人看看。您也不会遇到防火墙问题,这在商用 PC 上尤其猖獗。


还有一个更新:usr 更正确。命名管道非常好,但是阅读 WCF 是非常值得的。一开始可能看起来很费力,但在应用程序之间实现一个小型数据传输接口非常简单和容易。一旦它启动并运行,它就能够“在另一个应用程序中调用一个方法”需要很长的时间。没有类型转换,没有以任何方式序列化数据......这很棒,值得学习。

【问题讨论】:

    标签: c# vb.net network-programming tcpclient tcplistener


    【解决方案1】:

    TCP 始终适用于本地连接。这些称为环回连接。您无需将以太网电缆插入计算机两次即可使其与自己对话...

    对于仅本地通信,命名管道是一个不错的选择。它们更简单,速度更快。 .NET 很好地支持它们。

    如果可能,放弃 TCP 和任何其他基于流的接口。使用更高级别的 RPC 机制,例如 .NET 远程处理(非常简单,通过命名管道工作)或 WCF。 WCF 不需要托管网站项目。

    基本上,任何东西都比自己编写 RPC 机制要好。

    【讨论】:

    • 很高兴知道这一点。命名管道……了解潜伏在操作系统阴影中的新东西总是很有趣。谢谢,我会保留现有的,但也会研究您提供的替代方案,因为乍一看它们为我的案例提供了很多很好的机会。
    猜你喜欢
    • 1970-01-01
    • 2011-06-07
    • 2016-07-24
    • 2021-03-06
    • 1970-01-01
    • 2011-05-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多