1

如果您查看此Socket.BeginSend()方法的签名:

public IAsyncResult BeginSend(
    byte[] buffer,
    int offset,
    int size,
    SocketFlags socketFlags,
    AsyncCallback callback,
    Object state
)

我不明白bufferstate参数之间的区别。我有一个自定义类(包含 Socket 字段和其他自定义属性)。

通过创建一个字节数组并使用第一个参数(因此在缓冲区中)发送它们,或者最好使用第六个参数(状态对象)发送它们,发送到另一端的最佳方法是什么?

如果我在状态下发送它们,那么缓冲区用于什么?如果我将它们发送到缓冲区中,状态是否仅用于 StateObject 类?

还有一件事,我有许多自定义(和不同)类,我想发送到另一端,我将不得不做一些代码,这些代码会被某些参数“拆分”。怎么做?

4

2 回答 2

1

在 .NET 中BeginXxx/ EndXxxasync 模式通常看起来像:

IAsyncResult BeginXxx(..., AsyncCallback callback, Object state);
SomeResult EndXxx(IAsyncResult result);

状态对象是您传递的任何对象,以便您可以EndXxx通过调用IAsyncResult.AsyncState属性在回调或方法中检索状态。

state 参数仅用于支持这种模式,它不用于通过套接字发送任何内容。只有缓冲区中的数据会通过套接字发送。

我不太明白你问题的最后一部分,但是如果你想通过套接字发送对象,你可以简单地将你的对象序列化为 a byte[],通过套接字发送它,然后在另一端反序列化它。如果这不是你要问的,请告诉我。

于 2012-10-25T08:42:40.370 回答
1

@Marcus 的回答适合您问题的第一部分;状态对象不会通过网络发送,只是为了让您可以将EndXXX调用与调用对象的对象相关联BeginXXX

第二部分:

我有许多自定义(和不同)类,我想发送到另一端,我将不得不做一些代码,这些代码会被某些参数“拆分”。怎么做?

为此,您需要一个协议。最简单的方法是伪:

  1. 将要发送的对象 O 序列化为大小为 S 的字节数组 B
  2. 发送 S,例如可以是int一个字节数组 ( BitConverter.GetBytes())。
  3. 接收器接收前四个字节并重建int,所以它现在知道 S。
  4. 发送 B 的所有字节
  5. Receiver 一直读取直到它接收到 S 个字节,因此它可以重构 B 并反序列化对象 O。
于 2012-10-25T10:03:22.610 回答