【发布时间】:2016-07-16 19:20:05
【问题描述】:
这是一个使用异步 Socket 接收数据的工作(无用)示例。 完整代码可以在MSDN找到。
public class Class1
{
private static void Receive( Socket client )
{
StateObject state = new StateObject();
state.workSocket = client;
//state.buffer is a empty byte array
client.BeginReceive( state.buffer, 0, StateObject.BufferSize, 0,
new AsyncCallback(ReceiveCallback), state);
}
private static void ReceiveCallback( IAsyncResult ar )
{
StateObject state = (StateObject) ar.AsyncState;
Socket client = state.workSocket;
int bytesRead = client.EndReceive(ar);
//state.buffer contains now all the received data.
state.sb.Append(Encoding.ASCII.GetString(state.buffer, 0, bytesRead);
}
}
public class StateObject
{
public Socket workSocket = null;
public const int BufferSize = 256;
public byte[] buffer = new byte[BufferSize];
public StringBuilder sb = new StringBuilder();
}
在BeginReceive 方法中应该不可能影响state.buffer 字段,因为没有ref 或out 关键字。
但是字节数组实际上已经改变了值。
ReceiveMethode 中的state.buffer 字段怎么可能是空的,然后在ReceiveCallback 方法中访问时包含所有接收到的数据?
【问题讨论】:
-
在这种情况下,
buffer是一个数组。数组引用本身没有改变,但是数组的内容仍然是可变的。 -
如果它正常工作,它是一个无用的例子吗?
-
@cFrozenDeath 我只是添加了无用的,因为 StringBuilder 的内容没有被返回使用或其他东西。