Socket ConnectAsync Silverlight 4 возвращает успех, но сокет не подключен - PullRequest
2 голосов
/ 05 августа 2011

У меня есть файловый сервер политики и работает. Некоторое время я получал AccessDenied, потому что файл политики не был установлен должным образом. Теперь я больше не получаю эту ошибку, поэтому я знаю, что это не проблема. У меня работает простой сервер, который просто зацикливается на приеме клиентских подключений с любого адреса. Я также написал простой клиент, поэтому я знаю, что сервер работает. В Silverlight я устанавливаю свои аргументы и затем вызываю ConnectAsync. Он немедленно возвращается на localhost (имеет смысл), и когда я проверяю аргументы событий, LastOperation - это Connect, а SocketError - это Success. Однако, когда я проверяю мою розетку, она вообще не подключается. Есть идеи..? Из-за этого часами бился головой об стену.

Несколько других вещей, которые я пробовал. Я переместил серверы с моего локального ящика на другой сервер. Все еще не работал. Я сделал захват пакета и заметил, что он получает Файл Poilcy, но после этого браузер не отправляет ни одного пакета, который пытался бы даже подключиться к другому серверу.

    public void Connect(string ip)
    {
        SocketAsyncEventArgs saea = new SocketAsyncEventArgs();
        Socket socket = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
        var endpoint = new IPEndPoint(IPAddress.Parse(ip), 4502);
        saea.UserToken = socket;
        saea.RemoteEndPoint = endpoint;
        saea.Completed += new EventHandler<SocketAsyncEventArgs>(AsyncEventComplete);
        var completedSync = socket.ConnectAsync(saea);
        if (completedSync)
        {
            AsyncEventComplete(null, saea);
        }

        Result = ip;
    }

    void AsyncEventComplete(object sender, SocketAsyncEventArgs e)
    {
        switch (e.LastOperation)
        {
            case SocketAsyncOperation.Connect:
                MessageBox.Show("CONNECTED");
                break;
            case SocketAsyncOperation.Receive:
                MessageBox.Show("DATA RECEIEVED");
                // do stuff
                break;
        }
    }

1 Ответ

0 голосов
/ 10 августа 2011

Я думаю, вы должны использовать e.SocketError, а не e.LastOperation

Вы также можете использовать e.ConnectSocket (только в Silverlight)

Вы также должны добавить «not» в это условие: if (! ЗавершеноSync)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...