我是 C# 和多威胁应用程序的中级专家,我遇到了在应用程序运行时更改端口的问题(我认为最好的方法是销毁旧的 Socket 并打开一个全新的),但我不能这样做。
下面是我的部分代码 - WindowsForm 应用程序:
private byte[] data = new byte[1024];
private int size = 1024;
private Socket server;
delegate void Delegate();
public Form1()
{
InitializeComponent();
StartServer(11000);
}
public void StartServer(int port)
{
server = new Socket(AddressFamily.InterNetwork,
SocketType.Stream, ProtocolType.Tcp);
IPEndPoint iep = new IPEndPoint(IPAddress.Any, port);
server.Bind(iep);
server.Listen(100);
server.SetSocketOption(SocketOptionLevel.Socket, SocketOptionName.ReuseAddress, true);
server.BeginAccept(new AsyncCallback(AcceptConn), server);
listbox.Items.Add("[S] Server start...");}));
}
void AcceptConn(IAsyncResult iar)
{
Socket oldserver = (Socket)iar.AsyncState;
Socket client = oldserver.EndAccept(iar);
client.BeginReceive(data, 0, size, SocketFlags.None,
new AsyncCallback(ReceiveData), client);
}
void ReceiveData(IAsyncResult iar)
{
Socket client = (Socket)iar.AsyncState;
int recv = client.EndReceive(iar);
if (recv == 0)
{
client.Close();
server.BeginAccept(new AsyncCallback(AcceptConn), server);
return;
}
string receivedData = Encoding.ASCII.GetString(data, 0, recv);
byte[] message2 = Encoding.ASCII.GetBytes(receivedData);
listbox.BeginInvoke(new Delegate(() =>
{ listbox.Items.Add("[S] Rcv: " + receivedData); }));
}
上面的代码运行良好,但是当我想关闭这个 Socket 并打开一个新的时,我得到了一些错误:
案例1:错误::System.ObjectDisposedException:“无法访问已删除的对象。对象名称:'System.Net.Sockets.Socket'。”
private void change_button_Click(object sender, EventArgs e)
{
server.Close();
}
案例2:错误:System.Net.Sockets.SocketException:“发送或接收数据的请求已被阻止,因为套接字未连接并且在使用“发送到”调用“通过套接字发送数据报时未指定地址”
private void change_button_Click(object sender, EventArgs e)
{
server.Shutdown(SocketShutdown.Both);
}
案例3:不是错误,但现在我的应用程序在两个端口上侦听和处理连接,这不是以这种方式工作的。
private void change_button_Click(object sender, EventArgs e)
{
StartServer(22000);
}
有人可以帮我理解为什么我不能关闭创建的异步 TCP 套接字吗?感谢你!