问个小问题,我发誓绝对简单
本帖最后由 hrabeyond 于 2010-09-15 09:23:49 编辑 关于从Socket获取数据的问题,
服务端:
private static void OnRecievedData(IAsyncResult ar)
{
SocketCoderClient client = (SocketCoderClient)ar.AsyncState;
IList<ArraySegment<byte>> list=new List<ArraySegment<byte>>();
byte[] aryRet = client.GetRecievedData(ar);
ArraySegment<byte> arrByte = new ArraySegment<byte>(aryRet);
list.Add(arrByte);
//.......省略N步
//有一个客户端列表ClientsList,List<SocketCoderClient>类型
//这里的目的是向每个客户端发送所有客户端的数据
foreach(SocketCoderClient scc in ClientsList)
{
//判断等省略
clientSend.ReadOnlySocket.Send(aryRet);
}
}
// 摘要:
// 将列表中的一组缓冲区发送到连接的 System.Net.Sockets.Socket。
//
// 参数:
// buffers:
// System.Byte 类型的 System.ArraySegment<T> 的列表,它包含要发送的数据。
//
// 返回结果:
// 已发送到 System.Net.Sockets.Socket 的字节数。
//
// 异常:
// System.ArgumentNullException:
// buffers 为 null。
//
// System.ArgumentException:
// buffers 为空。
//
// System.Net.Sockets.SocketException:
// 试图访问套接字时发生错误。请参见下面的备注部分。
//
// System.ObjectDisposedException:
// System.Net.Sockets.Socket 已关闭。
public int Send(IList<ArraySegment<byte>> buffers);
Socket client_socket;
byte[] response = new byte[150000];
SocketAsyncEventArgs socketEventArg = new SocketAsyncEventArgs();
socketEventArg.Completed += OnReceiveCompleted;
socketEventArg.SetBuffer(response, 0, response.Length); //问题貌似出在这里
client_socket.ReceiveAsync(socketEventArg);
protected void OnReceiveCompleted(object sender, SocketAsyncEventArgs e)
{
this.Dispatcher.BeginInvoke(new mydelegate(xxxxxxxxx), e.BufferList); //这里接收到的不对劲了
}


private UdpClient m_SendClient = new UdpClient();
private UdpClient m_ReceiveClient = new UdpClient(3547);
public Form1() {
InitializeComponent();
}
private void button1_Click(object sender, EventArgs e) {
IPEndPoint ep = new IPEndPoint(IPAddress.Loopback, 3547);
m_SendClient.Send(new byte[] { 1, 2, 3, 4 }, 4, ep);
}
private void button2_Click(object sender, EventArgs e) {
SocketAsyncEventArgs arg = new SocketAsyncEventArgs();
arg.BufferList = new List<ArraySegment<byte>>() {
new ArraySegment<byte>(new byte[1]),
new ArraySegment<byte>(new byte[1]),
new ArraySegment<byte>(new byte[1]),
new ArraySegment<byte>(new byte[1])
};
arg.Completed += new EventHandler<SocketAsyncEventArgs>(arg_Completed);
m_ReceiveClient.Client.ReceiveAsync(arg);
}
private void arg_Completed(object sender, SocketAsyncEventArgs arg) {
IList<ArraySegment<byte>> bufferlist = arg.BufferList;
foreach (var buffer in bufferlist) {
foreach (byte b in buffer.Array) {
BeginInvoke(((Action)(()=>listBox1.Items.Add(b.ToString("X2")))));
}
}
}

