TCP-соединение не удалось - PullRequest
0 голосов
/ 19 октября 2011

Я устал выяснять, что не так с моим кодом ... Пожалуйста, помогите мне здесь!

Я пытаюсь создать TCP-соединение между сервером клиента в локальной сети. В результате происходит сбой программы при попытке подключения клиента. Пожалуйста, смотрите код:

public void Go()
        {
            if (whatjob == true)
            {
                IPEndPoint server_ipEndPoint = new IPEndPoint(IPAddress.Any, PortNum);
                server_socket = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
                server_socket.Bind(server_ipEndPoint);
                try
                {

                    server_socket.Listen(1);
                    server_GotClient = server_socket.Accept();
                }
                catch (SocketException e)
                {
                    MessageBox.Show("Unable to listen...");
                    MessageBox.Show(e.ToString());
                }


                reading = new Thread(new ThreadStart(this.get_msg));
                reading.Start();
            }

            if (whatjob == false)
            {
                IPEndPoint client_ipEndPoint = new IPEndPoint(IPAddress.Parse(IpAddress), PortNum);
                client_socket = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
                try
                {
                    client_socket.Blocking = true;
                    client_socket.Connect(client_ipEndPoint); //here it stops execution
                    //client_socket.BeginConnect(client_ipEndPoint, new AsyncCallback(NowConnected), client_socket);
                }
                catch (SocketException e)
                {
                    MessageBox.Show("Unable to connect...");
                    MessageBox.Show(e.ToString());
                    return;
                }
                reading = new Thread(new ThreadStart(this.get_msg));
                reading.Start();
            }

whatjob is bool ... true означает, что выполняет работу сервера, а false означает, что выполняет работу клиента.

эта функция находится внутри окна FORM для окна чата. когда он достигает до client_socket.connect (ipendpoint), он падает, и даже окно чата деформируется ...

Резьбовая функция

public void get_msg()
        {
            byte[] byte_message = new byte[1000];
            string string_message = null;
            int x = 0;
            while (true)
            {
                if (server_GotClient != null)
                {
                    x = server_GotClient.Receive(byte_message);
                }
                if (client_socket != null)
                {
                    x = client_socket.Receive(byte_message);
                }

                if (x != 0)
                {
                    string_message = Encoding.ASCII.GetString(byte_message);
                    this.richTextBox_GetMessage.Invoke(new MethodInvoker(delegate
                    {
                        richTextBox_GetMessage.Text = richTextBox_GetMessage.Text + "\nFriend: " + string_message;

                    }));
                }
                x = 0;
            }
            server_socket.Close();
        }

Пожалуйста, помогите относительно этого кода. Кроме того, я не знаю асинхронных методов, помогите мне с некоторыми простыми методами.

1 Ответ

2 голосов
/ 19 октября 2011

Было бы полезно узнать полное сообщение об ошибке.

Из того, что вы показали, я думаю, что выбрасываемое исключение не является SocketException.Документы MSDN для Socket.Connect показывают, что он может выдавать любое из четырех исключений, включая SocketException.

Я бы изменил тип исключения в перехвате на «Исключение» и установил точку останова на открывающей скобке.В следующий раз, когда он потерпит неудачу, вы будете точно знать, что идет не так, и вы можете отловить и обработать его оттуда.

Кроме того, я замечаю, что в то время как ваше клиентское задание возвращается из этого метода при ошибке соединенияработа сервера не выполняется;ловится исключение, показываются сообщения, и затем выполнение продолжается с reading = new Thread(new ThreadStart(this.get_msg));.Это может привести к тому, что будут исключены дополнительные исключения, которые вы не ожидаете.Если вы не уверены, что здесь происходит сбой потока клиентских заданий, я бы обратил внимание на другую сторону этого метода.

Что касается помощи с многопоточностью, есть много ресурсов, включая другие вопросы по SO, которыеможет помочь вам начать.Что именно вы хотите многопоточности, и как вы должны быть в состоянии контролировать это, неизвестно, поэтому любой ответ, который я попытаюсь дать, вероятно, будет содержать ошибки, которые еще больше расстроят вас, потому что это был неправильный подход.

...