Ответ кода состояния FTP не работает - PullRequest
0 голосов
/ 22 декабря 2011

Добро пожаловать!

У меня небольшая проблема с собственным приложением.Это приложение может быть подключен (сит сокет) к FTP-серверу, и его работа в порядке.Но моя проблема в том, что, если пользователь использует неверный логин или пароль, программа не получит статукод ответа.В чем дело?Я хотел бы использовать этот статус-код в каком-то пункте для проверки (usernem или / и пароль и т. Д.). Код:

public static void ReadResponse()
    {
        result = ParseHostResponse();
        statusCode = int.Parse(result.Substring(0, 3));
        statusMessage = "";       
    }

Метод ParseHostResponse () содержит следующее: Код:

public static string ParseHostResponse()
    {
        SocketAsyncEventArgs socketEventArg = new SocketAsyncEventArgs();
        socketEventArg.RemoteEndPoint = socket.RemoteEndPoint;
        socketEventArg.SetBuffer(buffer, BUFFER_SIZE, 0);

        socketEventArg.Completed += new EventHandler<SocketAsyncEventArgs>(delegate(object s, SocketAsyncEventArgs e)
        {
            if (e.SocketError == SocketError.Success)
            {
                statusMessage = Encoding.UTF8.GetString(e.Buffer, e.Offset, e.BytesTransferred);
                statusMessage = statusMessage.Trim('\0');
            }
            else
            {
                statusMessage = e.SocketError.ToString();
            }

        });

        socket.ReceiveAsync(socketEventArg);

        string[] msg = statusMessage.Split('\n');
        if (statusMessage.Length > 2)
        {
            statusMessage = msg[msg.Length - 2];
        }
        else
        {
            statusMessage = msg[0];
        }

        if (!statusMessage.Substring(3, 1).Equals(" "))
        {
            return ParseHostResponse();
        }

        return statusMessage;
    }

Если я приглашаю метод ReadResponse (), Visual Studio ответит этим исключением: NullReferenceException

в этом коде: Код:

.
.
string[] msg = statusMessage.Split('\n');
.

Что не так?Этот код выдает http://msdn.microsoft.com/en-us/library/hh202858%28v=vs.92%29.aspx#BKMK_RECEIVING

Спасибо за помощь!

1 Ответ

0 голосов
/ 23 декабря 2011

Я ничего не могу поделать, но должен начать со следующих замечаний:

  • statusMessage.Trim ('\ 0') не работает (попробуйте)
  • statusMessage.Split ('\ n') неэффективен, так как требует дополнительных выделений (угадайте почему)

Теперь к теме: я никогда не использовал сокеты в WP7, но из того, что я знаю об асинхронных операциях, мне кажется, что вы запускаете async op (вызывая ReceiveAsync) и используете результат (statusMessage) до получения ответа.

Подумайте немного о своем дизайне метода ParseHostResponse ():

  • Плохое имя: указывает на разбор ответа, в то время как он фактически осуществляет связь
  • Плохая функциональность: метод указывает на синхронизацию, но внутренне использует асинхронный шаблон. Я не знаю, что предложить здесь, поскольку каждое решение кажется неправильным. Например, ожидание ответа сделает пользовательский интерфейс невосполнимым.

Моя основная рекомендация - получить больше информации об асинхронном программировании и затем соответствующим образом перепрограммировать приложение.

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