TCP连接失败

时间:2011-10-18 20:42:23

标签: c# .net sockets tcp

我很想弄清楚我的代码有什么问题......请帮帮我吧!

我正在尝试在LAN中的服务器客户端之间创建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是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 个答案:

答案 0 :(得分:2)

了解完整的错误消息会有所帮助。

从你所展示的内容来看,我的想法是抛出的异常不是SocketException。 Socket.Connect的MSDN文档显示它可以抛出四个异常中的任何一个,包括SocketException。

我会将catch中的异常类型更改为Exception,并在开始括号上设置断点。下次失败时你会确切地知道出了什么问题,你可以从那里捕捉并处理它。

另外,我注意到虽然您的客户端作业确实在连接错误时退出了此方法,但服务器作业却没有;捕获异常,消息显示,然后继续执行reading = new Thread(new ThreadStart(this.get_msg));。这可能会导致额外的异常(您不期望这样)被抛弃。除非你确定客户端的工作流程在这里失败了,否则我会注意这个方法的另一面。

至于多线程的帮助,有很多资源,包括有关SO的其他问题,可以帮助您入门。您想要多线程以及您需要如何控制它的确切原因尚不清楚,因此我尝试给出的任何答案都可能会有错误,这些错误会让您进一步受挫,因为它不是正确的方法。

相关问题