客户端程序;
采用 异步的 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才能发送,很怪)
(现在就是找不到方法, 能把这部分发送到系统底层队列的数据,刷出去)
发送的socket需要设置下NoDelay=true
好像有点效果;
clientSocket = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
clientSocket.SetSocketOption(SocketOptionLevel.Tcp, SocketOptionName.NoDelay, true); (没有下面的 socket.Noday = true; 时也无效)
clientSocket.NoDelay = true;
大哥,吧socket的代码贴出来呀。虽然没看你代码。但是100%肯定是你client端代码问题
http://freshflower.iteye.com/blog/2285286
用得是这里面的代码;稍微改造了下,就是发送信息,先添加到队列;