2017-10-05 10 views
0

원시 명령을 사용하여 FTP 서버에 파일을 업로드하려고합니다. 네, 저는 이것을 수행하는 프로그램과 패키지가 있음을 압니다. 그러나 광산은 그러한 사치가없는 임베디드 어플리케이션입니다. 내 문제는 그 모든 적절한 명령을 성공적으로 발행 후, 그 파일이 서버에 존재하지 않는 것으로 나타났습니다. 여기 원시 FTP STOR 명령을 사용하는 방법

내가 무슨 짓을했는지 :

  1. I 포트 21 (Sock1) 내 FTP 서버에 명령 소켓 연결을 설정하고 인사말을 받게 나는 "USER MyUserName 에다"보내
  2. (코드 220) 및 내가 "유형 I"를 보내고 성공 코드가 나타날 성공 코드 (230)
  3. 을 "mypassword을 PASS"수신 전송 성공 코드를 331
  4. 을받을 200
  5. "PASV"를 보내 6 자리 숫자와 함께 성공 코드 227을받습니다.
  6. 이 숫자를 IP 주소와 포트로 디코딩합니다. 그들은 합리적으로 보인다.
  7. 위의 주소와 포트 (Sock2)에 대한 TCP 데이터 소켓 연결을 성공적으로 엽니 다.
  8. 나는 "STOR myfilename"를 보내 내가 successfuly Sock2에 myfilename의 내용을 보내
  9. 성공 코드 (150)를받을 수 있습니다.
  10. 나는 Sock2를 닫은 다음 Sock1을 닫는다.

모든 것이 정상적으로 처리되었지만 서버에는 파일이 없습니다. 아무도 내가 뭘 잘못했는지 말해 줄 수 있니?

PUT 명령을 사용하여 다양한 FTP 클라이언트 프로그램을 사용하여 파일을 업로드 할 수 있으므로 서버의 Ok를 알고 있습니다.

+1

서버가 성공적으로 전송할 때까지 기다려야한다는 점을 제외하고는 대부분 괜찮습니다. 즉 # 10 단계에서 sock2를 닫고 서버에서 226을 기다린 다음 sock1 만 닫습니다. 그리고 sock1을 닫기 전에 응답을 기다리는 것을 포함하여 종료 명령을 추가하십시오. 그 외에도 실제 구현은 여기에서 설명하는 것과 다릅니다. –

+0

당신은 Steffen이었고, sock2를 먼저 닫고 226을 기다렸습니다. 이것을 "답변"으로 제출하면 동의 할 것입니다. – DontPanic

답변

2
  1. myfilename의 내용을 Sock2에 성공적으로 보냅니다.
  2. 나는 Sock2를 닫은 다음 Sock1을 닫는다.
  3. 전송 데이터 연결 (sock2)을 수행

서버에 데이터의 끝을 폐쇄 할 필요가있다. 그러면 서버는 클라이언트에 대한 응답으로 응답합니다. 이 응답은 제어 채널 (sock1)을 닫기 전에 읽어야합니다. sock1과 sock2가 거의 같은 시간에 닫히면 서버는 데이터 채널 (sock2)이 닫히기 전에 제어 채널 (sock1)의 종료를 기록하고 따라서 데이터 전송을 중단 된 것으로 간주합니다.