首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 网站开发 > asp.net >

问个小疑点,小弟我发誓绝对简单

2013-04-09 
问个小问题,我发誓绝对简单本帖最后由 hrabeyond 于 2010-09-15 09:23:49 编辑关于从Socket获取数据的问题

问个小问题,我发誓绝对简单
本帖最后由 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不懂呀
[解决办法]
简单学习!
[解决办法]
代码太多,没兴趣啊

热点排行