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

Ваш аккаунт

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

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

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

Многострочный ответ ftp-сервера

5.3K
21 ноября 2009 года
NewGP
58 / / 17.09.2006
Пишу простенький фтп-клиент на winsock, проблема с многострочными ответами. При коннекте на ftp.kernel.org сервер после успешной аутентификации присылает довольно большее сообщение, пока его не примешь полностью, работать дальше не получится. Кто с этим сталкивался? Кто-нибудь реализовывал прием таких многострочных ответов?

У меня есть код:
Код:
int ReadFTPServerReply(SOCKET hControlChannel)
{
    int iBytesRead;
    int iBufferLength;
    int iEnd;
    int iSpaceRemaining;
    char gsRB[1024];
    int iReplySize;

    memset((char *)gsRB, 0, sizeof(gsRB));

    if((iBytesRead = recv(hControlChannel, gsRB, sizeof(gsRB), MSG_PEEK)) > 0) {
        printf("Bytes read: %d\n", iBytesRead);
        if((iReplySize = ReadReplyLine(gsRB)) == 0)
            iBufferLength = iSpaceRemaining = sizeof(gsServerReplyBuffer);
        else
            iBufferLength = iSpaceRemaining = iReplySize;
    }
    else
        return 999;

    iEnd = 0;

    do {
        iSpaceRemaining -= iEnd;
        iBytesRead = recv(hControlChannel, (char *)(gsServerReplyBuffer+iEnd), iSpaceRemaining, 0);
        iEnd+=iBytesRead;

        if(*(gsServerReplyBuffer+(iEnd-2)) == '\r' && *(gsServerReplyBuffer+(iEnd-1)) == '\n')
            break;
    } while (iBytesRead > 0 && iEnd < iBufferLength);

    if(iBytesRead == SOCKET_ERROR)
        return 999;

    gsServerReplyBuffer[iEnd] = '\0';
    return GetReplyCode(gsServerReplyBuffer);  //Просто переводит код ответа в int
}

int ReadReplyLine(char *lpszReplyBuffer)
{
    char *lpEOL = NULL;
    unsigned int nLimitReplyBytes;
    char temp[5] = "";
    char *pLastLineCode = &temp[0];
    char *lpLastLine = NULL;

    int i;
    temp[4] = '\0';
    nLimitReplyBytes = 0;
    if(*(lpszReplyBuffer+3) == MULTILINE_REPLY) { //#define MULTILINE_REPLY '-'
        for (i = 0; i < 3; i++ )
            *(pLastLineCode+i) = *(lpszReplyBuffer+i);

        *(pLastLineCode+i) = ' ';
        if((lpLastLine = strstr(lpszReplyBuffer, pLastLineCode))) {
            lpEOL = strstr(lpLastLine, (char *)EOL_MARKER); //#define EOL_MARKER "\r\n"
            nLimitReplyBytes = lpEOL ? (unsigned int)((lpEOL - lpszReplyBuffer)+2) : 0;
        }
        else
            nLimitReplyBytes = 0;

    }
    else {
        lpEOL = strstr(lpszReplyBuffer, (char *)EOL_MARKER);
        nLimitReplyBytes = lpEOL ? (unsigned int)((lpEOL - lpszReplyBuffer)+2) : 0;
    }

    return nLimitReplyBytes;
}


Но, к сожалению, желаемого результата я не достигаю. Есть предположение, что я в буфер gsServerReplyBuffer(объявлен как массив char [1024]) не принимаю все сообщение, поэтому и не могу найти нужный код ответа.
14
23 ноября 2009 года
Phodopus
3.3K / / 19.06.2008
Цитата: NewGP
Есть предположение...


Тык а проверить-то не судьба?

Реклама на сайте | Обмен ссылками | Ссылки | Экспорт (RSS) | Контакты
Добавить статью | Добавить исходник | Добавить хостинг-провайдера | Добавить сайт в каталог