문제

파일 기능을 업로드하는 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 서버 버전 0.9.37 베타

220 - Tim Kosse (tim.kosse@gmx.de)

220 http://sourceforge.net/projects/filezilla/ / em>

사용자 - 성공 -

계속하려면 아무 키나 누르십시오. ...에 .

이 하나는 서버 측에서 디스플레이

(000007) 5/17/2011 23:32:02 PM - (로그인하지 않음) (10.0.0.0.105)> 연결, 환영 메시지 보내기 ...

(000007) 5/17/2011 23:32:02 PM - (로그인하지 않음) (10.0.0.105)> 220-FileZilla 서버 버전 0.9.37 베타

(000007) 5/17/2011 23:32:02 PM - (로그인하지 않음) (10.0.0.105)> 220 - TIM KOSSE (tim.kosse@gmx.de) 쓴

(000007) 5/17/2011 23:32:02 PM - (로그인하지 않음) (10.0.0.105)> 220 http://sourceforge.net/projects/filezilla/

(000007) 5/17/2011 23:32:02 pm - (로그인하지 않음) (10.0.0.0.105)> 연결이 끊어졌습니다.

도움이 되었습니까?

해결책

FTP 명령은 캐리지 리턴 - 라인 피드 쌍 (\ r r \ n)으로 종료됩니다.\ r \ n을 사용자 명령 문자열에 추가해야합니다.

편집 : RFC 959 상담하십시오 (더 많은 FTP 관련RFC 959도 업데이트하고 확장하는 RFCs).기본 FTP 명령을 자세히 설명하고 쌍을 포함하여 예상 형식을 보여줍니다.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top