绑定发送套接字

时间:2017-01-18 12:25:14

标签: c# winforms sockets

我有一个带有两个按钮的表单,首先是启动侦听套接字,并显示带有地址的消息框,从中发送地址消息。第二个按钮用于发送消息,以便在我按下收听按钮时收听。我试图绑定已发送的套接字。例如,我想从端口50000发送它。我使用Bind方法,但它只在第一次工作,而不是例外,该地址通常只能使用一次,并且我需要重新打开我的表格。我怎么解决这个问题 ?这是我发送的代码:

    private void button2_Click(object sender, EventArgs e)
    {
        string local_host = System.Net.Dns.GetHostName();
        string local_ip_address = Dns.GetHostByName(local_host).AddressList[0].ToString();
        IPEndPoint send_point = new IPEndPoint(IPAddress.Parse(local_ip_address), 50000);

        Socket send_socket = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
        IPEndPoint connected_point = new IPEndPoint(IPAddress.Parse(textBoxIPListen.Text), 
                                                    Convert.ToInt32(textBoxPortListen.Text));
        try
        {
            send_socket.Bind(send_point);
            send_socket.Connect(connected_point);
            byte[] data = Encoding.Unicode.GetBytes("TestTest");
            send_socket.Send(data);
            send_socket.Close();
        }
        catch (Exception ex)
        {
            MessageBox.Show(ex.ToString());
        }
    }

2 个答案:

答案 0 :(得分:1)

li = li.Where(c => c.YearO > Convert.ToIn32(textFirst.Text) && c.YearO < Convert.ToIn32(textLast.Text)).select(s => s.YEarO) Bind()结合使用,可将Listen()绑定到指定的连接。基本上你可以socket套接字只能侦听特定的端口和地址,但要连接到另一个远程,你应该使用简单的Bind()方法。

正如文档中所述:https://msdn.microsoft.com/en-us/library/system.net.sockets.socket.bind(v=vs.110).aspx

  

您必须先调用Bind才能调用Listen方法。除非需要使用特定的本地端点,否则在使用Connect方法之前无需调用Bind。

在您的情况下,这意味着什么?这意味着您尝试绑定来自(假设)127.0.0.1:5000的数据包以通过127.0.0.1:4990。你当然可以这样做,但你必须记住,只要你想重新绑定&#34;就要从本地端点取消绑定这个套接字。

如果这是您的预期行为,那么我可以在关闭它后建议Connect()套接字。这将解除本地端点与套接字的绑定。例如:

Dispose()

修改

如果它仅在我第一次推荐send_socket.Close(); using ( send_socket ){ } 套接字时才有效:

using

或者您可以保持套接字实例绑定,使成员字段 try { using(send_socket) { send_socket.Bind(send_point); send_socket.Connect(connected_point); byte[] data = Encoding.Unicode.GetBytes("TestTest"); send_socket.Send(data); } } catch (Exception ex) { MessageBox.Show(ex.ToString()); } 成为Socket send_socket类的成员,并设置Form选项。

答案 1 :(得分:1)

不是在Try部分中调用send_socket.Close()而是在finally块中调用它,以确保即使引发异常,也关闭套接字。否则,如果出现任何问题,您可以保持套接字打开。

    try
    {
        send_socket.Bind(send_point);
        send_socket.Connect(connected_point);
        byte[] data = Encoding.Unicode.GetBytes("TestTest");
        send_socket.Send(data);
    }
    catch (Exception ex)
    {
        MessageBox.Show(ex.ToString());
    }
    finally
    {
        send_socket.Close();
    }