问个小问题,我发誓绝对简单
本帖最后由 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);
}
}
这里的Send方法用的是如下重载:
// 摘要:
// 将列表中的一组缓冲区发送到连接的 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); //这里接收到的不对劲了
}
现在的问题是:
我在服务端发送的是一个IList<ArraySegment<byte>>,但是在客户端SocketAsyncEventArgs只有e.Buffer
而e.BufferList为Null,我想是因为在socketEventArg.SetBuffer(response, 0, response.Length);这里出现了问题,
应该不能直接向一个byte[]中SetBuffer。
SetBuffer的重载里也没有向List中写的方法
请问我应该如何做才能够从服务端接收到BufferList,也就是接收到服务端返回的IList<ArraySegment<byte>>???
bu dong
[解决办法]
好简单,不懂。。。
[解决办法]
好简单,不懂。。。
[解决办法]
大清早 骗我。。

[解决办法]
只等接分。。。
[解决办法]
水平有限。。看来简单的问题也解决不了 惭愧。。。
[解决办法]
Socket没有解除过,帮顶
[解决办法]

[解决办法]
-,-楼主大清早忽悠我。
[解决办法]
这么简单的问题不好意思回答...呵呵!!(不懂....)
帮顶...
[解决办法]
+1
[解决办法]
我对SocketAsyncEventArgs中buffer和bufferlist的理解是调用ReceiveAsync投递的自定义缓冲区或者缓冲区列表。
Buffer: 用SetBuffer设置
BufferList:用BufferList setter 设置,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")))));
}
}
}
[解决办法]
顶一下吧 这么简单我都不会 看来我什么都不会 学习
[解决办法]
太“简单”了???来学习。。。呵呵
[解决办法]
不懂。。努力中、。
[解决办法]
根本没听说过的东西=。=
等待。。。。。学习。。。。。。
[解决办法]
顶一下。。。不会

[解决办法]
学习中 坐等
[解决办法]
呵呵!牛人真多!
[解决办法]
SocketAsyncEventArgs.SetBuffer 方法 (Byte(), Int32, Int32)
指定的缓冲区不明确。如果 Buffer 属性和 BufferList 属性都不为 null,将发生此异常。
参数超出范围。如果 offset 参数小于零或大于 Buffer 属性中的数组长度,将发生此异常。如果 count 参数小于零或大于 Buffer 属性中的数组长度减去 offset 参数的值,也会发生此异常。
我也不懂,你看上面滴对你有用不?
[解决办法]
绝对不简单。
[解决办法]
惭愧地路过
------解决方案--------------------
傻眼了,绝对简单的题目,一点想法都没有
[解决办法]
顶

[解决办法]
嘿嘿 一个帖子看出很多人不会通讯方面的
哎 我也不会 顶一下
[解决办法]
实在不简单,socket不懂呀
[解决办法]
简单学习!
[解决办法]
代码太多,没兴趣啊