//方法
void RecvData(IAsyncResult iar)
{ Socket remote = (Socket)iar.AsyncState;
try
{ string receivedData; receivedData = Encoding.Default.GetString(_recvDataBuffer, 0, _recvDataBuffer.Length);//接收到的来自服务器的数据 _msgManage(receivedData); remote.BeginReceive(_recvDataBuffer, 0, _recvDataBuffer.Length, SocketFlags.None, new AsyncCallback(RecvData), remote);//继续监听来自服务器的数据
}
catch (SocketException ex)
{
if (ex.ErrorCode == 10054)
{
//没有服务器 服务器强制关闭
remote.Shutdown(SocketShutdown.Both);
remote.Close(); //通知表示层
}
}
}
//方法#region 发送数据的方法
public void sendMsg(string msg)
{
byte[] data = Encoding.Default.GetBytes(msg); ClientSocket.BeginSend(data, 0, data.Length, SocketFlags.None,
new AsyncCallback(SendDataEnd), ClientSocket);
} void SendDataEnd(IAsyncResult iar)
{
Socket remote = (Socket)iar.AsyncState;
int sent = remote.EndSend(iar);
}
#endregion
监听 和 发送的基本方法是这样写的问题:
第一次如果客户发送的信息 是 “ABCD”
那么接收到的信息是 “ABCD”
第二次发送的信息 如果是“ABCDE”
接收到的信息是 “ABCDE”第三次发送的信息 如果是“ppp”
那么接收到的信息就变成 “pppDE”了第四次发送的信息 如果是“x”
那么接收到的信息就变成 “xppDE”了
每次收到的信息长度都会是 历史发送信息的最长的那个
信息的 最前部分会得到更新;是不是 _recvDataBuffer 数组需要清空?具体怎么解决呢?
各位大哥帮忙!谢谢了;
解决方案 »
- XML中CDATA中元素值怎么修改
- 》》》.net中使用BitBlt的奇怪问题,非常怪!!!
- 为什么有的namespace会跨dll而存在?
- C# Process执行批处理后如何获取返回值?
- asp.net如何获取登陆用户的邮件地址?
- 问几个关于网络编程的小问题解决就给分
- doc变成rtf为什么内存变大了
- 调查一下有多少人在用或用过Microsoft Enterprise Library!UP有分!
- 为什么我用HtmlInputFile上传文件大于4M就会出错
- 救救孩子吧,c#窗体
- 谁做过paypal支付接口,过来帮帮我啊!
- 请问那位知道Microsoft.Office.Interop.word.dll/Microsoft.Office.Interop.PowerPoint.dll哪里能下载
receivedData = Encoding.Default.GetString(_recvDataBuffer, 0, _recvDataBuffer.Length);
参考如下代码:private void EndReceiveDatagram(IAsyncResult iar)
{
lock (this)
{
try
{
int readBytesLength = m_socket.EndReceive(iar); // 实际的长度
iar.AsyncWaitHandle.Close(); if (readBytesLength == 0)
{
// 以断开连接
}
else // 正常数据包
{
// 处理接收数据
}
}
catch (Exception err)
{
// 处理异常
}
}
}
笔者有一个Socket框架EMTASS2.1请参考http://blog.csdn.net/hulihui/archive/2008/10/27/3158613.aspx
或根据数据的长度,只取这个长度的数据也可.
1 array.clear(recvDataBuffer,0,recvDataBuffer.length);2 int i=remote.EndReceive()
receivedData = Encoding.Default.GetString(_recvDataBuffer, 0,i);//接收到的来自服务器的数据