vc ++ - сокет не пишет в порт - PullRequest
1 голос
/ 27 марта 2011

Я пытаюсь создать FTP-клиент с возможностью загрузки файла.Но сокет не отправляет сообщение на сервер, даже если он установил соединение с сервером.См. Код ниже

#include <iostream>
#include <string>
#include <tchar.h>
#include <Winsock2.h>

#include <winsock2.h>
#include <ws2tcpip.h>
#include <stdio.h>
#include <stdlib.h> 

int main(int argc,wchar_t * argv[])
{

    WSADATA wsaData = {0};
    int iResult = 0;

    iResult = WSAStartup(MAKEWORD(2, 2), &wsaData);

    if (iResult != 0)
    {
        wprintf(L"WSAStartup failed: %d\n", iResult);
        return 1;
    }

    SOCKET sock= socket(AF_INET,SOCK_STREAM,IPPROTO_TCP);
    if (sock == INVALID_SOCKET) 
        wprintf(L"socket function failed with error = %d\n", WSAGetLastError() );
    else
        std::wcout << " Success occured in socket creation " << std::endl ;

    SOCKADDR_IN sock_Addr={0};
    sock_Addr.sin_family=AF_INET;
    sock_Addr.sin_port=htons(21);
    sock_Addr.sin_addr.S_un.S_addr=inet_addr("10.0.0.105");

    char recv_Buf[1000]={'\0'};
    if(connect(sock,(SOCKADDR *)&sock_Addr,sizeof(SOCKADDR_IN)) != 0)
        std::cout << " Error in connection " << std::endl ;
    else
    {
        std::string tmp;
        u_long mode =1; // non blocking socket
        ioctlsocket(sock,FIONBIO,&mode);
        int result = recv(sock,recv_Buf,sizeof(recv_Buf),0);
        while( result > 0 )
        {
            tmp=tmp+recv_Buf;
            result = recv(sock,recv_Buf,sizeof(recv_Buf),0);
        }
        std::cout << "connection - success - " << tmp << std::endl ;
    }

    ioctlsocket(sock,FIONBIO,0);
    std::string buf="USER administrator";
    if(send(sock,buf.c_str(),buf.size(),0)== SOCKET_ERROR)
    std::cout << " sending user - error  " << WSAGetLastError() << std::endl ;
    else
    {
        std::string tmp;
        u_long mode =1; // non blocking socket
        ioctlsocket(sock,FIONBIO,&mode);
        int result = recv(sock,recv_Buf,sizeof(recv_Buf),0);
        while( result > 0 )
        {
            tmp=tmp+recv_Buf;
            result = recv(sock,recv_Buf,sizeof(recv_Buf),0);
            std::cout << "received " << recv_Buf << std::endl ;
        }
        std::cout << "user - success - " << tmp << std::endl ;
    }
}

Примечание. Я использую filezilla Для проверки этого.Он покажет входящие соединения и команды.Так что если кто-нибудь поможет мне в этом вопросе, я буду вам благодарен.

Редактировать Ниже приведен результат командной строки на стороне клиента (моя сторона)

Успех произошел в создании сокета

соединение - успех - 220-FileZilla Server версии 0.9.37 бета

220-написанный Тимом Коссе (Тим.Kosse @ gmx.de)

220 Пожалуйста, посетите http://sourceforge.net/projects/filezilla/

пользователь - успех -

Нажмите любую клавишу для продолжения .,.

Этот файл был отображен на стороне сервера

(000007) 17.05.2011 23:32:02 PM - (не вошел в систему) (10.0.0.105)>Подключено, отправка приветственного сообщения ...

(000007) 17.05.2011 23:32:02 - (не авторизован) (10.0.0.105)> 220-FileZilla Server версия 0.9.37 бета

(000007) 17.05.2011 23:32:02 PM - (не зарегистрирован) (10.0.0.105)> 220-написано Тимом Коссе (Tim.Kosse@gmx.de)

(000007) 17.05.2011 23:32:02 PM - (не авторизован) (10.0.0.105)> 220 Пожалуйста, посетите http://sourceforge.net/projects/filezilla/

(000007) 17.05.2011 23:32:02 PM - (не авторизован) (10.0.0.105)> отключен.

1 Ответ

3 голосов
/ 27 марта 2011

Команды FTP завершаются парой возврата каретки - перевод строки (\ r \ n).Вам необходимо добавить \ r \ n к вашей командной строке USER.

Редактировать: вам следует обратиться к RFC 959 для получения дополнительной информации (есть больше связанных с FTP RFC, которые также обновляют и расширяют RFC 959).В нем есть раздел, подробно описывающий базовые команды FTP и показывающий ожидаемый формат, включая пару .

...