socket只能接受第一条数据

wangyanhaoer 2012-11-13 08:36:45
第一次收到数据后就再也收不到了,只能重启才能收。接受的代码如下
private static void ServerListen()
{
//获取服务器IP
string hostName = Dns.GetHostName();
IPAddress[] ip = Dns.GetHostAddresses(hostName);
IPAddress HostIp = ip[0];
lgServer.WriteLog(DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss: IP地址:") + HostIp.ToString());
//创建一个网络端点
IPEndPoint iep = new IPEndPoint(IPAddress.Any, ListenPort);
Socket serverSocket = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
serverSocket.Bind(iep);
serverSocket.Listen(60);
try
{
bool IsEnd = true; //接收数据结束标志
StateObject so = new StateObject();

int dataLengthPlan = 0; //应收数据长度(报文中定义的数据长度)
int dataLengthRecv = 0; //实收数据长度

while (SeverFlag)
{
FeedbackSocket = serverSocket.Accept();
while (SeverFlag)
{
byte[] b = new byte[StateObject.BufferSize];
int len = FeedbackSocket.Receive(b);
if (len > 0)
{
if (IsEnd) //新的请求
{
so = new StateObject(); //重新初始化数据对象
dataLengthPlan = (int)BitConverter.ToUInt32(b, 0); //获取应收数据长度
}

byte[] tmp = new byte[len]; //按实际收到的数据长度截取
Array.Copy(b, tmp, len);
so.allData.InsertRange(so.allData.Count, tmp); //当数据不能1次性全部接收时,需要拼包处理
dataLengthRecv += len;
if (dataLengthRecv >= dataLengthPlan) //一个请求的数据全部接收完毕,即实收长度>=应收长度
{
IsEnd = true;
dataLengthRecv = dataLengthPlan = 0;
DealwithTraffic(so);
}
else //数据没有全部接收结束,则继续接收
IsEnd = false;
}
}
}
}
catch (Exception ex)
{
lgServer.WriteLog(DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss") + ": 接受消息进程错误" + ex.Message);
}
}
...全文
138 1 打赏 收藏 转发到动态 举报
写回复
用AI写文章
1 条回复
切换为时间正序
请发表友善的回复…
发表回复
  • 打赏
  • 举报
回复
死循环,想烧坏CPU么?

110,536

社区成员

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

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

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