Отладка TCP соединения - C#

Формулировка задачи:

Всем привет. Народ, посмотрите со стороны на мой код, кто разбирается. У меня глючит клиентская часть TCP:
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)
                {
                    ...
                }
        }
Проблема в том, что первый запуск проходит идеально (начинается все с вызова Connect()), все подключается. После я закрываю соединение (тег <end>) и начинается петрушка. Снова вызываю Connect(), ConnectCallback-вызывается, а вот в ReceiveCallback уже не заходит. Каким-то необъяснимым образом эта программа работает через раз. Один раз она вторично не подключается, второй раз она подключается. Есть какие-нибудь мысли?

Код к задаче: «Отладка TCP соединения - C#»

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]);
        }

14   голосов, оценка 4.071 из 5


СОХРАНИТЬ ССЫЛКУ