解决方案 »
- WPF中如何控制每个像素透明度
- 未将对象引用设置到对象的实例??
- 用正则表达试 去掉前面 第一第二个逗号与其间的数字,怎写
- 能不能获取一个Cache里的剩余过期时间??
- 请问下大家觉得 《C# 高级编程(第3版)》这本书怎么样?
- (WIN窗体)如何让picturebox显示动画GIF??
- 奇怪问题:使用Request.QueryString传递一个中文参数,结果少了一个字!
- 关于打印GridView的问题(不用水晶报表怎么搞),还有水晶报表的问题(用水晶报表是不是还要下载插件),高手来看看(window环境下)
- 有C#中如何实现记录集的移动?
- 请问有没有好用的富文本过滤器,用来防范xss攻击
- XML结点插入问题
- 中缀表达式转换为后缀表达式并求值的算法是否可以支持多位数和小数?
就是我BeginReceive读了的数据,第二次读为什么还能把之前的数据都读出来。。我是用Available属性或者EndReceive值来标记应该该读多少数据
客户端用tcpclient的Available都能达到目的
举个列子
客户端发送数据 服务端接收数据
AAAA AAAA
BBBB AAAABBBB
依次类推
而且,假如客户端只发送一次数据,回调中的Console.WriteLine(str);会无休止执行下去,Available 永远不为0
private static void ReceiveCallBack(IAsyncResult ar)
{
var stateObject = ar.AsyncState as StateObject;
int readlength = stateObject.CurrentSocket.EndReceive(ar);
//if (readlength > 0)
//{
// string str = Encoding.GetEncoding("gb2312").GetString(stateObject.buffer, 0, stateObject.CurrentSocket.Available);
// Console.WriteLine(str);
//}
//这里是死循环。。不加这个,连接成功后,客户端只有第一次发送数据能回调,而且readlength还是0,之后客户端再发送数据就不会回调了
if (stateObject.CurrentSocket.Poll(-1, SelectMode.SelectRead))
{
stateObject.CurrentSocket.BeginReceive(stateObject.buffer, 0, stateObject.CurrentSocket.Available, SocketFlags.Peek, new AsyncCallback(ReceiveCallBack), stateObject);
if (stateObject.CurrentSocket.Available > 0)
{
string str = Encoding.GetEncoding("gb2312").GetString(stateObject.buffer, 0, stateObject.CurrentSocket.Available);
Console.WriteLine(str);
}
}
}
那poll是干啥的安?msdn看了没看懂喃,哪种情景用这玩意儿private static void ReceiveCallBack(IAsyncResult ar)
{
var stateObject = ar.AsyncState as StateObject;
int readlength = stateObject.CurrentSocket.EndReceive(ar);
if (readlength <= 0)
{
stateObject.CurrentSocket.BeginReceive(stateObject.buffer, 0, stateObject.CurrentSocket.Available, SocketFlags.None, new AsyncCallback(ReceiveCallBack), stateObject);
}
else
{
string str = Encoding.GetEncoding("gb2312").GetString(stateObject.buffer, 0, readlength);
Console.WriteLine(str);
stateObject.CurrentSocket.BeginReceive(stateObject.buffer, 0, stateObject.CurrentSocket.Available, SocketFlags.None, new AsyncCallback(ReceiveCallBack), stateObject);
}
//if (readlength > 0)
//{
// string str = Encoding.GetEncoding("gb2312").GetString(stateObject.buffer, 0, stateObject.CurrentSocket.Available);
// Console.WriteLine(str);
//} //这里是死循环。。不加这个,连接成功后,客户端只有第一次发送数据能回调,而且readlength还是0,之后客户端再发送数据就不会回调了
//if (stateObject.CurrentSocket.Poll(-1, SelectMode.SelectRead))
//{
// stateObject.CurrentSocket.BeginReceive(stateObject.buffer, 0, stateObject.CurrentSocket.Available, SocketFlags.Peek, new AsyncCallback(ReceiveCallBack), stateObject);
// if (stateObject.CurrentSocket.Available > 0)
// {
// string str = Encoding.GetEncoding("gb2312").GetString(stateObject.buffer, 0, stateObject.CurrentSocket.Available);
// Console.WriteLine(str);
// }
//}
}