У меня средний опыт в 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); }));
}
Над кодом работает отлично, но когда я хочу закрыть этот сокет и открыть новый, я получаю некоторые ошибки :
case 1: Error :: System.ObjectDisposedException: «Невозможно получить доступ к удаленному объекту. Имя объекта: 'System. Net .Sockets.Socket'."
private void change_button_Click(object sender, EventArgs e)
{
server.Close();
}
case 2 : ОШИБКА: System. Net .Sockets.SocketException: «Запрос на отправку или получение данных был заблокирован, поскольку сокет не подключен, и не был указан адрес при отправке дейтаграммы через сокет с использованием вызова« send to »»
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);
}
Может кто-нибудь помочь мне понять, почему я не могу закрыть созданный asyn c TCP Socket? Спасибо тебе!