Отладка TCP соединения - C#
Формулировка задачи:
Всем привет. Народ, посмотрите со стороны на мой код, кто разбирается. У меня глючит клиентская часть TCP:
Проблема в том, что первый запуск проходит идеально (начинается все с вызова Connect()), все подключается. После я закрываю соединение (тег <end>) и начинается петрушка. Снова вызываю Connect(), ConnectCallback-вызывается, а вот в ReceiveCallback уже не заходит. Каким-то необъяснимым образом эта программа работает через раз. Один раз она вторично не подключается, второй раз она подключается. Есть какие-нибудь мысли?
private IPHostEntry ipHost; private IPAddress ipAddr; private String Myip; private IPEndPoint ipEndPoint; private Socket sock; private void Connect() { ipHost = Dns.Resolve(ipAddr.ToString()); ipAddr = ipHost.AddressList[0]; ipEndPoint = new IPEndPoint(ipAddr, 11000); sock = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp); sock.BeginConnect(ipEndPoint, new AsyncCallback(ConnectCallback), sock); SendServ("Client was started!"); sock.BeginReceive(buffer, 0, buffer.Length, 0, new AsyncCallback(ReceiveCallback), sock);//второй раз эта функция уже не вызывается //ждем ответа и обрабатываем //для закрытия соединения вызываем: SendServ("<end>"); } public void ConnectCallback(IAsyncResult ar) { try { Socket sclient = (Socket)ar.AsyncState; sclient.EndConnect(ar); } catch (Exception ex) { } } public void SendServ(String sms) { try { byte[] msg = Encoding.Default.GetBytes(Dns.GetHostName()); sock.BeginSend(msg, 0, msg.Length, 0, new AsyncCallback(SendCallback), sock); SendDone.WaitOne(); SendDone.Reset(); string theMessage = sms; msg = Encoding.Default.GetBytes(theMessage); sock.BeginSend(msg, 0, msg.Length, 0, new AsyncCallback(SendCallback), sock); SendDone.WaitOne(); if (theMessage.IndexOf("<end>") > -1) { sock.BeginReceive(buffer, 0, buffer.Length, 0, new AsyncCallback(ReceiveCallback), sock); sock.Shutdown(SocketShutdown.Both); sock.Close(); } } catch (Exception ex) { } } public void SendCallback(IAsyncResult ar) { try { Socket sclient = (Socket)ar.AsyncState; int bytesSent = sclient.EndSend(ar); SendDone.Set(); } catch (Exception ex) { } } public void ReceiveCallback(IAsyncResult ar) { Socket sclient = (Socket)ar.AsyncState; int bytesRead = sclient.EndReceive(ar); if (bytesRead > 0) { ... } }
Решение задачи: «Отладка TCP соединения»
textual
Листинг программы
static void Main(string[] args) { Thread t = new Thread(server); t.IsBackground = true; t.Start(); Socket s = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp); EndPoint ep = new IPEndPoint(IPAddress.Loopback, 0); s.Bind(ep); s.Connect(IPAddress.Loopback, 12000); s.Send(new byte[8]); s.Receive(new byte[8]); s.Close(); s = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp); ep = new IPEndPoint(IPAddress.Loopback, 0); s.Bind(ep); s.Connect(IPAddress.Loopback, 12000); s.Send(new byte[8]); s.Receive(new byte[8]); s.Close(); Console.Write("Complite"); Console.ReadKey(); } static void server() { Socket s = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp); EndPoint ep = new IPEndPoint(IPAddress.Loopback, 12000); s.Bind(ep); s.Listen(10); Socket s1 = s.Accept(); s1.Receive(new byte[8]); s1.Send(new byte[8]); Socket s2 = s.Accept(); s2.Receive(new byte[8]); s2.Send(new byte[8]); }