首页 新闻 会员 周边 捐助

C# Socket 异步发送的问题,很麻烦,值得挑战................................................

0
悬赏园豆:50 [已解决问题] 解决于 2017-05-18 15:05

客户端程序;

采用 异步的 BeginSend/EndSend, BeginReceive/EndRecie 进行发送跟接收数据; 

当一直不断的对服务端进行发送数据时,服务器端能接收正常;但过了一段时间后,客户端最后一次BeginSend数据(本次有执行到EndSend,提醒发送成功),服务端没有接收到数据;

这次BeginSend的数据,只能等到下一次的 BeginSend才能成功;

就是本次BeginSend会触发上次未发送成功的数据,本次的data,程序也会进行EndSend,但实际,没有发送成功!

----------------------------------------------------------

改造

1. SocketAsyncEventArgs 也一样;

2. 将Send添加成自定义的 队列中, 再开一个线程,获取数据,再发送; 情况好一次,但久了也还是会出现类拟的情况 (有对发送的频率进行控制);

private void realSends()
        {
            int sendPad = 0;
            MessageType mt;
            Thread thread = new Thread(delegate()
            {
                while (true)
                {
                    mt = MessageQueue.getMessage();

                    if (mt != null)
                    {
                        sendPad++;
                        Send(mt);
                    }

                    if (sendPad >= 5) //控制发送频率
                    {
                        sendPad = 0;
                        Thread.Sleep(2000);
                    }
                    else
                    {
                        Thread.Sleep(200);
                    }

                }
            });
            thread.IsBackground = true;
            thread.Start();
        }

 

-------------------------------------------------

对于这种情况,该如何处理?

BeginSend或SocketAsyncEventArgs,都是用的是完成端口的模型,据说是一种非复杂的东西,Socket发送的数据,会先到操作系统底层的某种队列,再依据底层操作完成,再通知应用程序接收处理EndSend;如果发送速度太快,似乎会出现异常情况,数据有到EndSend得到完成通知,但是实际没有发送到服务端;这部分数据要等到下一次的BeginSend才能发送,很怪

现在就是找不到方法, 能把这部分发送到系统底层队列的数据,刷出去

Weiseditor的主页 Weiseditor | 初学一级 | 园豆:74
提问于:2017-05-18 10:46
< >
分享
最佳答案
0

发送的socket需要设置下NoDelay=true

收获园豆:50
Daniel Cai | 专家六级 |园豆:10424 | 2017-05-18 13:47

好像有点效果; 

 

clientSocket = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
clientSocket.SetSocketOption(SocketOptionLevel.Tcp, SocketOptionName.NoDelay, true); (没有下面的 socket.Noday = true; 时也无效)

clientSocket.NoDelay = true;

Weiseditor | 园豆:74 (初学一级) | 2017-05-18 15:03
其他回答(1)
0

大哥,吧socket的代码贴出来呀。虽然没看你代码。但是100%肯定是你client端代码问题

czd890 | 园豆:14488 (专家六级) | 2017-05-18 11:15

http://freshflower.iteye.com/blog/2285286

用得是这里面的代码;稍微改造了下,就是发送信息,先添加到队列;

支持(0) 反对(0) Weiseditor | 园豆:74 (初学一级) | 2017-05-18 11:51
清除回答草稿
   您需要登录以后才能回答,未注册用户请先注册