Справочник функций

Ваш аккаунт

Войти через: 
Забыли пароль?
Регистрация
Информацию о новых материалах можно получать и без регистрации:

Почтовая рассылка

Подписчиков: -1
Последний выпуск: 19.06.2015

c++ FTP сервер. Клиент не воспринимает сообщение сервера

10K
02 февраля 2012 года
Frenzyk
41 / / 16.01.2009
Пишу ФТП сервер. Проходит аутентификация:
Код:
DWORD WINAPI CommunicationThread( LPVOID param )
{
    bool UserOK = 0;
    bool PassOK = 0;

    #define DEFAULT_BUFLEN 2048

    char recvbuf[DEFAULT_BUFLEN];
    char commandBuf[DEFAULT_BUFLEN];
    int commandBufLenght = 0;
    int iResult, iSendResult;
    int recvbuflen = DEFAULT_BUFLEN;

    SOCKET CommandSocket = INVALID_SOCKET;
    CommandSocket = *(SOCKET*)param;

    ZeroMemory(recvbuf, DEFAULT_BUFLEN );
    ZeroMemory(commandBuf, DEFAULT_BUFLEN );

    WaitForSingleObject(Mutex1, INFINITE);
    cout << "ClientSocket_in_thread: " << CommandSocket << endl;
    ReleaseMutex(Mutex1);

     iSendResult = send(CommandSocket, "220 Clear for entry, HafFTPserver\n", 35, 0);
        if (iSendResult == SOCKET_ERROR) {
            printf("send failed: %d\n", WSAGetLastError());
            closesocket(CommandSocket);
            return 1;
        }


    do {
         iResult = recv(CommandSocket, recvbuf, recvbuflen, 0);
         if (iResult > 0)
         {
             WaitForSingleObject(Mutex1, INFINITE);
             cout << "Message " << iResult << " : ";
             for(int i = 0; i<iResult; i++)
             {cout <<recvbuf;}
             cout<<endl;
             ReleaseMutex(Mutex1);

             if(((recvbuf[iResult-1]!=10)&&(recvbuf[iResult-2]!=13))) // ждем \n, что будет значить конец команды и дописываем команду, пока не встретим
             {
                 strcat(commandBuf,recvbuf);
                 commandBufLenght += iResult;
                 ZeroMemory(recvbuf, DEFAULT_BUFLEN );
             }else // если встретилось \n в конце строки, то обрабатываем команду
             {
                 strcat(commandBuf,recvbuf);
                 commandBufLenght += iResult;

                 if(!strncmp(commandBuf,"USER",4))
                 {
                     char *user;
                     user = (char*)calloc(commandBufLenght-6, 1);

                     strncat( user,&commandBuf[5] ,commandBufLenght-7);
                     for(int i =0; i<UserCount; i++)
                     {
                        if(Users&&!strcmp(Users,user))
                        {
                            cout << "user \"" << user << "\" found!"<<endl;
                            UserOK = 1;
                            iSendResult = send(CommandSocket, "331 Password required\n", 23, 0);
                                if (iSendResult == SOCKET_ERROR) {
                                    printf("send failed: %d\n", WSAGetLastError());
                                    closesocket(CommandSocket);
                                    return 1;
                                }
                        }

                     }
                 }

                 ZeroMemory(commandBuf, DEFAULT_BUFLEN );
                 ZeroMemory(recvbuf, DEFAULT_BUFLEN );
                 commandBufLenght = 0;
             }
         }
         else if (iResult == 0)
         {printf("Connection closing...\n"); closesocket(CommandSocket); system("pause");}
        else {
                printf("recv failed: %d\n", WSAGetLastError());
                closesocket(CommandSocket);
                system("pause");
                return 1;
            }
        } while (iResult > 0);

   
    return 0;
}


Так вот в ReGet такая фигня:

Не видет второго сообщения от сервера. Причем неважно, что туда пихать, хоть "331 Password required\n", хоть что угодно другое. При этом на сервер файлзиллы коннектится нормально. И с другой стороны клиент файлзиллы нормально видит второе сообщение:

Что за фигня и как бороться?
277
02 февраля 2012 года
arrjj
1.7K / / 26.01.2011
А сервер то в консоль что пишет?

[COLOR="white"]Новый термин: очень вложенный условный оператор : D[/COLOR]
10K
02 февраля 2012 года
Frenzyk
41 / / 16.01.2009
Сервер пишет, что соединение закрыто в ReGet или получает пароль в Filezilla
В общем сам допер: ReGet чувствителен к тому, что еще и каретку надо возвращать, а не только новую строку в конце кманды отпускать: 331 Password required\r\n - сработало. Но всё же странно, что первое сообщение 220 Clear for entry, HafFTPserver\n глотает и без \r
С другой стороны
 
Код:
else if(!strncmp(commandBuf,"SYST",4))
                 {
                     iSendResult = send(CommandSocket, "215 WIN\r\n", 9, 0);

Опять ReGet замолкает с пустой полученной строкой. Кстати что вообще для программы значит ответ на SYST и что мне стоит в ответе написать: UNIX emulated или всё-таки WIN?
10
03 февраля 2012 года
Freeman
3.2K / / 06.03.2004
Frenzyk, исходники SlimFTPd смотрел?
10K
03 февраля 2012 года
Frenzyk
41 / / 16.01.2009
Посмотрел: что у меня строка отправляется, что там - один черт. Я даже незнаю, гдже здесь споткнуться можно, это ж просто статическая строка. Слип пробовал ставить. А можно как-то явно очистить сокет, перед отправкой сообщеия, чтоб точно знать, что мусора вместе со строкой не уйдет? Хотя я смотрел tcpdump'ом, вроде высылается нормальная строка. А вот в в FZ еще прикол: при попытке переконнектится бывает на команду PWD перед "257 E:\C++Proje..." попадает какой-то мусор, типа "por" или "215 WIN" хотя вервер выводит строку, которая отправляется адеквано и что-то я чую, что если посмотреть tcpdump'ом, то он она тож будет без мусора. Я незаю, может издержки localhost'a?
UPD: попробовал закомментить пару cout'ов, так мусор в FZ пропал. ReGet по презжнему не воспринемает команду.
Реклама на сайте | Обмен ссылками | Ссылки | Экспорт (RSS) | Контакты
Добавить статью | Добавить исходник | Добавить хостинг-провайдера | Добавить сайт в каталог