Второй вызов chrome.sockets.tcp.send всегда приводит к «500 недопустимой команде: попробуйте быть более креативным»

#sockets #ftp #google-chrome-app

#сокеты #ftp #google-chrome-app

Вопрос:

Создание FTP-клиента как приложения Chrome с использованием chrome.sockets.tcp.

Сначала я продолжал получать «500 недопустимой команды: попробуйте быть более креативным» каждый раз, когда я пытался отправить пароль. Затем я понял, что он возвращает эту ошибку во второй команде, независимо от того, какую команду я отправлял.

Ie. USER, за которым следует PASS, выдаст мне ошибку. ПОДВИГ, за которым следует USER, выдаст мне ошибку. ПОДВИГ, за которым следует СПРАВКА, выдаст мне ошибку.

Я пробовал ждать интервал перед выдачей второй команды. безрезультатно.

 chrome.app.window.create('index.html', {
  id: "helloWorldID",
    bounds: {
    width: width,
    height: height,
    left: Math.round((screenWidth-width)/2),
    top: Math.round((screenHeight-height)/2)
   }
});


var IP = "server.com";
var PORT = 21;
var ftp_username = "user";
var ftp_password = "password";
var socketID;

function ab2str(buf) {
   return String.fromCharCode.apply(null, new Uint8Array(buf));
 }
function str2ab(str) {
   var buf = new ArrayBuffer(str.length*2); // 2 bytes for each char
   var bufView = new Uint8Array(buf);
   for (var i=0, strLen=str.length; i<strLen; i  ) {
     bufView[i] = str.charCodeAt(i);
   }
   return buf;
 }

function onCallback( result ){
    console.log( "onCallback", result );    
};

chrome.sockets.tcp.create({ persistent:false }, function(createInfo) {
    socketID = createInfo.socketId;

    chrome.sockets.tcp.connect( socketID, IP, PORT, onCallback);
});

chrome.sockets.tcp.onReceive.addListener(function(info) {
    //console.log( "onReceive", info.socketId );
    var d = ab2str( info.data );
    console.log( d );

    if (d.indexOf("220 ")>-1){

        // send user.
        console.log( "send "   ftp_username);
        chrome.sockets.tcp.send( socketID, str2ab("USER " ftp_username "n"), onCallback );
    }
    if (d.indexOf("331 ")>-1){
        // send password.
        console.log( "send password");
        chrome.sockets.tcp.send( socketID, str2ab("PASS " ftp_password "n"), onCallback );
    }

  });
  chrome.sockets.tcp.onReceiveError.addListener(function(info) {
      console.log( "onReceiveError", info );
  });

});
 

Комментарии:

1. Для чего нужен str2ab? Как насчет прямой передачи строки в send()?

2. str2ab преобразует строку в ArrayBuffer, который chrome.sockets.tcp.send ожидает в качестве 2-го параметра.

3. Почему вы резервируете два байта на символ в буфере массива? Попробуйте с одним.

4. @Danila это было так! Спасибо! можете ли вы опубликовать ответ, чтобы я мог его принять?

Ответ №1:

Вы должны зарезервировать 1 байт на символ в ArrayBuffer вместо двух

 var buf = new ArrayBuffer(str.length); // 1 byte for each char
 

Ответ №2:

Возможно, вы захотите завершить строки для отправки, используя rn только but n .

Из RFC 959:

Протокол передачи файлов соответствует спецификациям протокола Telnet для всех соединений через управляющее соединение. Поскольку язык, используемый для связи по Telnet, может быть согласованным вариантом, все ссылки в следующих двух разделах будут относиться к «языку Telnet» и соответствующему «коду конца строки Telnet». В настоящее время можно считать, что это означает NVT-ASCII и <CRLF> . Никакие другие спецификации протокола Telnet не будут указаны.

Команды FTP — это «строки Telnet», завершающиеся «кодом конца строки Telnet». […]

Комментарии:

1. Я действительно пробовал это, спасибо. Это была одна из моих первых мыслей. К сожалению, это не сработало. Тот же результат, что и при использовании только n .