如果你看一下这个Socket.BeginSend()
方法的签名:
public IAsyncResult BeginSend(
byte[] buffer,
int offset,
int size,
SocketFlags socketFlags,
AsyncCallback callback,
Object state
)
我不明白buffer
和state
参数之间的区别。我有一个自定义类(包含Socket字段和其他自定义属性)。
通过创建一个字节数组并使用第一个参数(因此在缓冲区中)发送它们或者最好用第6个参数(状态对象)发送它们,最好的方法是在另一端发送?
如果我在状态下发送它们,那么缓冲区用于什么?如果我在缓冲区中发送它们,状态仅用于StateObject类吗?
还有一件事,我有很多自定义(和不同的)类要发送给另一方,我将不得不做一些将由某个参数“拆分”的代码。怎么做?
答案 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中:
int
)发送为字节数组(BitConverter.GetBytes()
)。int
,因此现在知道S。