C# Socket 长连接,第一次能接收,第二次有时也行,第三次就不行了。求教为何会这样子,如何修改?

delegate void setText();//定义一个线程委托
private void button2_Click(object sender, EventArgs e)
{

Thread demoThread = new Thread(new ThreadStart(this.ThreadProcSafe));
demoThread.Start();

}
private void ThreadProcSafe()
{
setText d = new setText(Threading); //实例化一个委托
this.Invoke(d); //在拥用此控件的基础窗体句柄的线程上执行指定的委托
}
public void Threading()
{

try
{
int server_receive_port = 12345;
IPAddress server_receive_ip = IPAddress.Parse(GetLocalIp());//将 IP 地址字符串转换为 IPAddress 实例
IPEndPoint server_ipe = new IPEndPoint(server_receive_ip, server_receive_port);//将网络端点表示为 IP 地址和端口号。
Socket server_socket = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
server_socket.Bind(server_ipe);//绑定
for (int i = 1; i > 0;i++ )
{
server_socket.Listen(1);//参数指定队列中最多可容纳的等待接受的传入连接
Socket temp = server_socket.Accept();

clientip = (IPEndPoint)temp.RemoteEndPoint;

string recvStr = "";
byte[] recvBytes = new byte[1024*8];
int bytes;
bytes = temp.Receive(recvBytes);// 接收指定字节数的数据,并将数据存入接收缓冲区。
recvStr = Encoding.UTF8.GetString(recvBytes);
textBox1.Text += recvStr;
textBox1.Text +=DateTime.Now.Day.ToString() +"日"+ DateTime.Now.Hour.ToString() +"时"+ DateTime.Now.Minute.ToString() +"分"+ DateTime.Now.Second.ToString()+"秒";
textBox1.Text += System.Environment.NewLine; //每次购物另起一行
textBox1.Update();
recvStr = "";
bytes = 0;
BeepUp.Beep(500, 700);
this.BringToFront();

}
}
catch (ArgumentNullException es)
{
Console.WriteLine("ArgumentNullException: {0}", es);
}
catch (SocketException es)
{
Console.WriteLine("SocketException: {0}", es);
}
Console.ReadLine();

}

第1个回答  2012-07-14
1、你这个接收的时候做的是个死循环吧。
2、我觉得接包应该这样处理:首先,接收客户端的数据,接收完后解析buff,解析完后处理自己的一系列逻辑。然后准备接下一个包。至于这个过程建议写成回调函数的方式。
3、按你描述的错误的话,可能是接到一个包之后解析出了问题。导致后面的无法继续解析。
第2个回答  2012-07-14
要不要我发你一个例子啊