异步socket通讯问题

sunrain_leo 2004-10-30 12:28:56
各位大老!
/// <summary>
/// 开始监听端口信息
/// </summary>
/// <param name="strIP">服务器IP地址</param>
/// <param name="intPort">端口号</param>
/// <param name="intClient">客户端号</param>
public static void StartListening(string strIP,int intPort,int intClient)
{
//开启服务器地址和端口
IPEndPoint localEndPoint = new IPEndPoint(IPAddress.Parse(strIP),intPort);
Socket objSocketListener = new Socket(AddressFamily.InterNetwork,SocketType.Stream,ProtocolType.Tcp);
objSocketListener.Bind(localEndPoint);
objSocketListener.Listen(intClient);
while(true)
{
// 每个请求都复位一次
Parameter.clsParameter.mreAllDone.Reset();
// 异步处理每个请求
objSocketListener.BeginAccept(new AsyncCallback(AcceptCallback),objSocketListener);
// 等待一次连接请求处理结束
Parameter.clsParameter.mreAllDone.WaitOne();
}
}

/// <summary>
/// 设置接收前的准备工作
/// </summary>
/// <param name="objIAsyncResult"></param>
public static void AcceptCallback(IAsyncResult objIAsyncResult)
{
/// 每个请求都复位一次
Parameter.clsParameter.mreAllDone.Set();
/// 当当前客户端连接数目小于系统设置的最大连接数目时候建立新的连接
if((Parameter.clsParameter.intCurrentClientLength < Parameter.clsParameter.intMaxClientLength) && (Parameter.clsParameter.intCurrentClientLength >= 0))
{
Socket objSocketListener = (Socket)objIAsyncResult.AsyncState;
Socket objSocketHandler = objSocketListener.EndAccept(objIAsyncResult);
StateObject objStateObject = new StateObject();
objStateObject.objSocketWork = objSocketHandler;
/// 建立连接后,并将当前客户端连接数据加一
Parameter.clsParameter.intCurrentClientLength ++;
objSocketHandler.BeginReceive(objStateObject.btBuffer,0,StateObject.intBufferSize,0,new AsyncCallback(ReadCallback),objStateObject);
}
}

/// <summary>
/// 开始接收数据
/// </summary>
/// <param name="objIAsyncResult"></param>
public static void ReadCallback(IAsyncResult objIAsyncResult)
{
StateObject objStateObject = (StateObject)objIAsyncResult.AsyncState;
Socket objSocketHandler = objStateObject.objSocketWork;
string strIP = objSocketHandler.RemoteEndPoint.ToString();
int intBytesRead = objSocketHandler.EndReceive(objIAsyncResult);

if(intBytesRead > 0)
{
string strTemp = "";

byte[] btReceive = new byte[intBytesRead];
for(int i=0;i<intBytesRead;i++)
{
btReceive[i] = objStateObject.btBuffer[i];
strTemp += btReceive[i].ToString();
}

/// 可以实现接收到的字符的完全转换
/// 客户端发送:5豆腐干似懂非懂34534地方“;速度dfsdfsd
/// 接收端接收:5豆腐干似懂非懂34534地方“;速度dfsdfsd
//System.Text.Encoding objEncoding = System.Text.Encoding.GetEncoding("GB2312");
//strTemp = objEncoding.GetString(btReceive);
/// 但是对于本GPRS接收程序,为了减少数据通讯量,需要对接收的数据保持16进制的样子,然后强行转换为字符,然后再处理
Util.clsUtil.WirteFile(strTemp);

Send(objSocketHandler,btReceive);

/// 解析数据包内容
PackUnpackData.clsPackUnpackData.ddrDealData(objSocketHandler,strTemp);

objSocketHandler.BeginReceive(objStateObject.btBuffer,0,StateObject.intBufferSize,0,new AsyncCallback(ReadCallback),objStateObject);
}
}

/// <summary>
/// 异步发送
/// </summary>
/// <param name="handler"></param>
/// <param name="byteData"></param>
public static void Send(Socket handler,byte[] byteData)
{
try
{
handler.BeginSend(byteData, 0, byteData.Length, 0,new AsyncCallback(SendCallback),handler);
}
catch(Exception ex)
{
Parameter.clsParameter.strSystemInfo += "[" + DateTime.Now.ToString() + "] 发送失败:" + ex.ToString();
}
}

/// <summary>
/// 回调接收数据
/// </summary>
/// <param name="objIAsyncResult"></param>
private static void SendCallback(IAsyncResult objIAsyncResult)
{
try
{
Socket objSocketHandler = (Socket)objIAsyncResult.AsyncState;
int bytesSent = objSocketHandler.EndSend(objIAsyncResult);
Parameter.clsParameter.strSystemInfo += "[" + DateTime.Now.ToString() + "] 发送成功:" + objSocketHandler.RemoteEndPoint.ToString();
}
catch(Exception ex)
{
Parameter.clsParameter.strSystemInfo += "[" + DateTime.Now.ToString() + "] 发送失败:" + ex.ToString();
}
}

/// <summary>
/// 保存套接字和信息
/// </summary>
public class StateObject
{
public Socket objSocketWork = null; // 客户套接字
public const int intBufferSize = 512; // 缓冲区大小
public byte[] btBuffer = new byte[intBufferSize]; // 接收缓冲区
}


如上,主程序启动后,则启动监听程序,不接收客户端的信息
我现在从客户端发送来的数据基本在100个字节以内,此用异步方式的时候,每次收到数据之后,都需要将收到的数据保存到数据中,这样在
public static void ReadCallback(IAsyncResult objIAsyncResult)
{
……
if(intBytesRead > 0)
{
……
PackUnpackData.clsPackUnpackData.ddrDealData(objSocketHandler,strTemp);/// 此处是执行保存数据的过程
}
……
}
但是由于是异步执行,有没有可能当在保存数据的时候,监听拒绝其他客户端发送来的信息,造成数据丢失?????????????????????
...全文
140 3 打赏 收藏 转发到动态 举报
写回复
用AI写文章
3 条回复
切换为时间正序
请发表友善的回复…
发表回复
EricYao2013 2004-10-30
  • 打赏
  • 举报
回复
不会的,其实在主监听线程里面的那个回调函数会派生一个子socket线程的.
sywcf 2004-10-30
  • 打赏
  • 举报
回复
应该不会的,我前几天也做了一个异步的程序,你说的情况应该不会发生吧。
sunrain_leo 2004-10-30
  • 打赏
  • 举报
回复
http://community.csdn.net/Expert/topic/3505/3505744.xml?temp=.6686975

111,125

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术 C#
社区管理员
  • C#
  • Creator Browser
  • by_封爱
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

让您成为最强悍的C#开发者

试试用AI创作助手写篇文章吧