C#套接字错误10022

时间:2009-11-10 11:13:49

标签: c# sockets

我在使用C#.NET3.5中的套接字的应用程序中出现错误10022。

在我的代码中,我将套接字绑定到本地IP地址。 当我不再需要它时,我只需将其断开(reader.socket.Disconnect(true);)并使用“true”即可重新使用它。

但是当我再次调用“bind”方法时,它会因10022错误(无效参数)而崩溃。

如果我将此方法的行设置为注释,则它会在“listen”行崩溃,表示已经设置了连接(虽然我调用了disconnect!)

有什么想法吗?

由于


以下是失败的代码部分:

public void WaitConnexion(IPEndPoint localEP)
        {
            if (localEP.Port != 9000)
            {
                MessageBox.Show("Le port doit être 9000");
                return;
            }
            LocalEndPoint = localEP;

            if (reader.socket.Connected)
            {
                MessageBox.Show("Vous êtes déjà connecté", "Conflit de connexion", MessageBoxButton.OK, MessageBoxImage.Exclamation);
                return;
            }

            // on bind le socket avec le endpoint local, et on le met en attente de connexion asynchrone

          //  reader.socket = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);


            reader.socket.Bind(localEP);

            reader.socket.Listen(1);

            reader.socket.BeginAccept(new AsyncCallback(WaitConnexionCallBack), reader.socket);
        }

这是带有回调的diconnect方法:

 public void Disconnect()
        {
            if (!reader.socket.Connected)
                return;


            reader.socket.BeginDisconnect(true, new AsyncCallback(DisconnectCallBack), reader.socket);


        }

       private void DisconnectCallBack(IAsyncResult result)
        {
            reader.socket = (result.AsyncState as Socket);
            reader.socket.EndDisconnect(result);


            if (Disconnected != null)
                Disconnected(this, EventArgs.Empty);



        }

1 个答案:

答案 0 :(得分:1)

我找到了解决方案。

似乎垃圾收集器没有被足够快地调用,在内存中放入一些实际处理掉的socket的值。

DisconnectedCallBack中的代码修改:

   reader.socket = (result.AsyncState as Socket);
   reader.socket.EndDisconnect(result);
   reader.socket.close(0);
   GC.Collect();  // call garbage collector to clean the socket

WaitConnexion中的代码修改:

 reader.socket = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);

重新创建套接字。