【问题标题】:.NET TCP socket with session.NET TCP 套接字与会话
【发布时间】:2010-03-16 19:05:41
【问题描述】:

有没有办法在 C# 中处理带有套接字的会话?

我的问题示例:
我有一个在端口 5672 上侦听套接字的服务器。

TcpListener socket = new TcpListener(localAddr, 5672);  
socket.Start();  
Console.Write("Waiting for a connection... ");  

// Perform a blocking call to accept requests.  
TcpClient client = socket.AcceptTcpClient();  
Console.WriteLine("Connected to client!");

我有两个客户端会发送一个字节。客户端 A 发送 0x1,客户端 B 发送 0x2。 从服务器端,我像这样读取这些数据:

Byte[] bytes = new Byte[256];
String data = null;

NetworkStream stream = client.GetStream();
while ((stream.Read(bytes, 0, bytes.Length)) != 0)
{
     byte[] answer = new ...
     stream.Write(answer , 0, answer.Length);
}  

然后客户端 A 发送 0x11。 我需要一种方法来知道这个客户端与之前发送的“0x1”相同。

【问题讨论】:

    标签: c# .net sockets


    【解决方案1】:

    每个TcpClient 实例用于不同的连接。 TCP 中的连接由四部分组成:源 IP、源端口、目标 IP、目标端口。所以,即使你有相同的目标 IP 和端口,以及相同的源端口,你也有两个不同的连接。

    一个客户端发送的数据不会与另一个客户端发送的数据混在一起。客户端在连接上发送的数据将通过该连接按顺序接收。

    会话成为问题的唯一情况是在连接关闭后记住客户端。

    【讨论】:

    • 我不明白数据如何不会被混合。在我读取第一个客户端发送的数据后,TcpClient 对象被销毁。要读取以下数据,我必须执行 socket.AcceptTcpClient();再次。您可以发布一个演示代码来检测客户端 A 在 sendig 0x1 之后何时发送 0x11 吗?谢谢
    • @ZeCarlos:你真的需要关闭TcpClient 实例吗?为什么不重复使用它们?每个人都可以从一个客户端为您提供未损坏的数据流。
    • 你是对的。我可以重用 TcpClient 及其关联的流。对不起我的无知。谢谢
    • @ZeCarlos:没有理由为无知道歉。只是为了不试图减轻无知。
    【解决方案2】:

    您可能需要实现自己的协议才能识别客户端。也许定义一个字节块,除了数据之外,你还包括一个客户端标识符。

    【讨论】:

    • 感谢您的回答,但我不能这样做。我正在实现一个通过 TCP 进行通信的协议。我无法修改客户发送的信息。
    • @ZeCarlos:那么谁定义了客户端发送的数据格式?
    • 它是一个协议。 AMQP 就是这种情况。 amqp.org/confluence/download/attachments/720900/… 但是帧中的数据没有任何标识客户端的字段。我通过知道客户端使用的 ip 和端口来识别。我正在寻找一些自动完成的方法
    • 我认为您将需要某种传输层加密。我仍然不太了解您的需求,无法在这里提出一些好的建议。 en.wikipedia.org/wiki/Transport_Layer_Security
    【解决方案3】:

    您将需要某种身份验证或预先协商的令牌,并且所有这些都以某种方式用一些盐加密。

    【讨论】:

    • 您当然不需要任何加盐哈希或加密来进行识别,但根据具体需要,可能会推荐它。
    【解决方案4】:

    关于如何在 Web 世界 (HTTP) 中实现会话的现有文献很多。

    一个关键是您是关闭客户端连接,还是它们是持久的?如果它们是持久的,那么只需通过它们的对象引用来识别它们。如果没有,那么……

    1) 您可以根据源 IP 地址进行简单会话。但是,如果多个客户端位于 NAT 防火墙后面,共享 IP,则不起作用,请参阅下一个选项。

    2) 使用“cookie”

    3) 使用身份验证来识别每个客户端

    除了基于 IP 的会话之外的每个选项都需要向协议本身添加一些内容。

    使用套接字要记住的一些事情。远程 IP + 远程端口唯一标识一个客户端 TCP 套接字。来自同一个远程客户端的多个连接将具有不同的远程端口。但是如果套接字关闭,您不能依赖它,因为远程操作系统可能会在旧端口超时后回收远程端口以进行新连接。

    【讨论】:

      猜你喜欢
      • 2012-12-15
      • 2017-01-02
      • 2014-01-13
      • 2010-09-15
      • 1970-01-01
      • 1970-01-01
      • 2020-07-02
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多