由于某种原因,连接到异步套接字失败

时间:2017-08-09 18:49:16

标签: c# sockets asynchronous

我目前正在为自己制作一个软件平台。我有客户端和服务器端软件。我使用异步套接字,我在连接方面遇到了一些问题。这是我的连接功能。

private bool ConnectSocket()
{
    try
    {
        if((this.soket != null) && this.soket.Connected)
        {
            this.soket.Shutdown(SocketShutdown.Both);
            Thread.Sleep(10);
            this.soket.Close();
            return false;
        }
        this.soket = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
        System.Net.IPAddress adresa = System.Net.IPAddress.Parse(Properties.Settings.Default.server_ip);
        IPEndPoint EndPoint = new IPEndPoint(adresa, 0x9de);
        this.soket.Blocking = false;
        AsyncCallback callback = new AsyncCallback(this.OnSocketConnect);
        this.soket.BeginConnect(EndPoint, callback, this.soket);
        if(this.soket.Connected) Console.WriteLine("Uspesno je konektovan socket");
        return true;

    }
    catch(SocketException ex)
    {
        MessageBox.Show("Dogodila se greska prilikom povezivanja na server");
        Console.WriteLine(ex.ToString());
    }
    return false;
}

即使我没有连接我的服务器,它也会识别(监听)我的连接,并且存在某种连接。问题是我无法从这一点继续,我无法发送任何数据,因为我没有连接的例外,我也没有超过这个if语句。

if(this.soket.Connected) Console.WriteLine("Uspesno je konektovan socket");

有关如何解决这个问题的任何建议吗?

1 个答案:

答案 0 :(得分:1)

不是100%肯定你想要完成什么但是在if语句中查看你的try catch你是否试图关闭连接,如果已经存在连接?以下是我会尝试的一些简单建议。

private bool ConnectSocket()
    {
        try
        {                
            this.soket = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
            System.Net.IPAddress adresa = System.Net.IPAddress.Parse(Properties.Settings.Default.server_ip);
            IPEndPoint EndPoint = new IPEndPoint(adresa, 0x9de);
            this.soket.Blocking = false;
            AsyncCallback callback = new AsyncCallback(this.OnSocketConnect);
            this.soket.BeginConnect(EndPoint, callback, this.soket);
            if(this.soket.Connected) Console.WriteLine("Uspesno je konektovan socket");
            return true;

        }
        catch(SocketException ex)
        {
            MessageBox.Show("Dogodila se greska prilikom povezivanja na server");
            Console.WriteLine(ex.ToString());
        }
        return false;
    }

上述解决方案只是尝试重置连接而不关闭if语句中出现的内容。

private bool ConnectSocket()
        {
            try
            {                
                this.soket = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
                System.Net.IPAddress adresa = System.Net.IPAddress.Parse(Properties.Settings.Default.server_ip);
                IPEndPoint EndPoint = new IPEndPoint(adresa, 0x9de);
                this.soket.Blocking = false;
                AsyncCallback callback = new AsyncCallback(this.OnSocketConnect);
                this.soket.BeginConnect(EndPoint, callback, this.soket);
                if(this.soket.Connected) Console.WriteLine("Uspesno je konektovan socket");
                return true;
                if((this.soket == null) && this.soket.Connected == false)<-- or what ever the evaluation for not connection would be.
                    {
                        this.soket.Shutdown(SocketShutdown.Both);
                        Thread.Sleep(10);
                        this.soket.Close();
                        return false;
                    }

                }
            catch(SocketException ex)
            {
                MessageBox.Show("Dogodila se greska prilikom povezivanja na server");
                Console.WriteLine(ex.ToString());
            }
            return false;
        }

上面的解决方法只是在if = = null上使用!=所以它只会在连接为空时关闭,仔细检查以确保你有所有正确的IP等等来进行连接

希望这有帮助!如果不让我知道,我将删除答案(我必须使用答案,因为我不能在50代表评论)干杯!