我有一个带有两个按钮的表单,首先是启动侦听套接字,并显示带有地址的消息框,从中发送地址消息。第二个按钮用于发送消息,以便在我按下收听按钮时收听。我试图绑定已发送的套接字。例如,我想从端口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());
}
}
答案 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();
}