【问题标题】:How to connect to a TCP Socket, send data for authorization before receiving data如何连接到 TCP Socket,在接收数据之前发送数据进行授权
【发布时间】:2012-03-12 11:01:21
【问题描述】:

我正在使用 Rx 连接到 Socket 并接收数据。我遇到的问题是,在连接到 Socket 后,我​​需要先发送数据进行授权,然后才能接收到数据。

连接

public static IObservable<Unit> WhenConnected(this Socket socket, IPAddress address, int port)
{
    return Observable.FromAsyncPattern<IPAddress, int>(
        socket.BeginConnect,
        socket.EndConnect)(address, port);
}

接收数据

不会发布所有代码,但总而言之,它使用 TakeWhile 从 Begin/End Receive 异步方法重复接收字节。

var receiveData = Observable.FromAsyncPattern
    <byte[], int, int, SocketFlags, int>(socket.BeginReceive, socket.EndReceive);

问题 1:

现在我的问题是如何构建我的订阅?

var query = from _ in socket.WhenConnected(IPAddress.Parse(_host), _port)
            //need to authorize before receiving data
            from value socket.DataReceived().Repeat()
            select value;

using (query.Subscribe(...

问题 2

通常我会使用 NetworkStream 而不是 Socket 发送信息包,所以我需要做一些完全不同的事情吗?

【问题讨论】:

    标签: c# sockets system.reactive


    【解决方案1】:

    Rxx library 有一些扩展方法对这类操作非常有帮助。在1.3版本的StreamExtensions.cs里面,有

    public static IObservable<byte[]> ReadObservable(this Stream stream, int count)
    

    public static IObservable<Unit> WriteObservable(this Stream stream, byte[] buffer, int offset, int count)
    

    可用于网络流。我不确定以下是否是最好的方法,但可以设置如下:

    NetworkStream networkStream = null;
    var setupStreamPlan = Observable
      .When(WhenConnected(...))
      .Then(_ => networkStream = new NetworkStream(socket));
    var authorizePlan = Observable
      .When(setupStreamPlan)
      .Then(_ => networkStream.WriteObserable(/*message to write*/);
    var listenPlan = Observable
      .When(authorizePlan)
      .Then(_ => networkStream.ReadObservable(10).Repeat());
    var constantSizeMessageStream = Observable
      .When(listenPlan)
      .Switch();
    

    编辑:允许设置 networkStream

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2015-06-27
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2022-10-23
      • 2011-09-13
      • 2023-04-11
      • 2017-01-19
      相关资源
      最近更新 更多