首页 新闻 会员 周边

socketClient想利用SocketAsyncEventArgs不停想服务器端发送消息

0
悬赏园豆:5 [待解决问题]
        private void AsyncSend()
        {
            if (this.connected)
            {
                if (sendEventArgs.Buffer != null)
                    sendEventArgs.SetBuffer(null, 0, 0);
                
                byte[] bytesMessage = new byte[1024];// m_socketHandler.PushSendBuffer();
                Console.WriteLine("push成功");
                i++;
               // sendEventArgs.SetBuffer(bytesMessage, 0, bytesMessage.Length);
                sendEventArgs.SetBuffer(Encoding.UTF8.GetBytes(i.ToString()), 0, Encoding.UTF8.GetBytes(i.ToString()).Length);
                sendEventArgs.UserToken = this.client;
                sendEventArgs.RemoteEndPoint = this.serverEndPoint;

                sendEventArgs.Completed += new EventHandler<SocketAsyncEventArgs>(sendEventArgs_Completed);

                client.SendAsync(sendEventArgs);
            }
        }

        private void sendEventArgs_Completed(object sender, SocketAsyncEventArgs e)
        {

            if (e.SocketError == SocketError.Success)
            {
                Console.WriteLine(Encoding.UTF8.GetString(e.Buffer));
                Console.WriteLine("发送成功....");
                if (e.LastOperation == SocketAsyncOperation.Send)
                {
                    Console.WriteLine("继续发送数据...");

                    try
                    {

                       // Thread.Sleep(5000);
                        AsyncSend();
                    }
                    catch (Exception ex)
                    {
                        Console.WriteLine(ex.Message);
                    }

                }
            }
        }

上面的代码我想让程序重复发送数据给服务器端。

结果执行结果如下

我的疑问是为什么前两次发送是没有问题的,而第三次发送后,结果执行了两遍回调函数,而且更严重的是,如下:

这个对象已经被占用了。测试了好久,都是这个错误。

没有搞懂这个错误是什么原因导致的,请高手们赐教。

kklin的主页 kklin | 菜鸟二级 | 园豆:203
提问于:2012-12-26 14:26
< >
分享
所有回答(2)
0

这问题的确存在,暂时解决办法是不用同一个SocketAsyncEventArgs,如果不想重复创建

SocketAsyncEventArgs可以用pool.
beetlex | 园豆:247 (菜鸟二级) | 2012-12-27 10:14
0
你的问题在于使用了同一个SocketAsyncEventArgs,你可以依照我的IoContextPool.cs写一个pool,在使用前从pool中取SocketAsyncEventArgs,响应sendEventArgs_Completed时,将SocketAsyncEventArgs归还给pool。
zhoutk | 园豆:202 (菜鸟二级) | 2012-12-27 10:49
清除回答草稿
   您需要登录以后才能回答,未注册用户请先注册