使用异步BeginSend方法

时间:2012-10-25 08:16:57

标签: c# sockets asynchronous

如果你看一下这个Socket.BeginSend()方法的签名:

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

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

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

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

还有一件事,我有很多自定义(和不同的)类要发送给另一方,我将不得不做一些将由某个参数“拆分”的代码。怎么做?

2 个答案:

答案 0 :(得分:1)

在.NET中,BeginXxx / EndXxx异步模式通常类似于:

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

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

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

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

答案 1 :(得分:1)

@Marcus'的答案适合你问题的第一部分;状态对象不会通过网络发送,只有这样您才能将EndXXX调用与调用BeginXXX的对象相关联。

第二部分:

  

我有许多自定义(和不同)类要发送给另一方,我将不得不做一些将由某个参数“拆分”的代码。怎么做?

你需要一个协议。最简单的方法是,在psuedo中:

  1. 将要发送的对象O序列化为大小为S
  2. 的字节数组B.
  3. 将S(例如,int)发送为字节数组(BitConverter.GetBytes())。
  4. 接收器接收前四个字节并重建int,因此现在知道S。
  5. 发送B
  6. 的所有字节
  7. 接收器继续读取,直到收到S字节为止,因此可以重建B并反序列化对象O.