2013-06-10 6 views
0

글쎄, 다중 스레드 FTP 서버를 작성 중이며 이제 데이터 전송 중단을 구현하려고합니다. 이것은 데이터 전송 유산을 관리하는 코드의 일부입니다.ftp 서버에서 데이터 전송을 중단 할 때의 클라이언트 동작

ABORCommand(); //sends message with code 226 (1st message) 
pthread_join(threads, &ret); //waits for the thread processing data transfer 

sprintf(buffer, "226 Transfer complete - %d bytes copied.\r\n", data_comm->num_bytes); 
Send(); //this just sends the message in buffer to the client (2nd message) 
WriteToLog("transfer complete", "226"); 

close(data_comm->clie_sock); //closes the data connection 
delete data_comm; //this deletes instance of the class taking care of data transfer 
  1. 내 문제는 데이터 전송을 중단 할 때 내가 테스트하고있는 두 개의 클라이언트 (노틸러스과에서 gftp 클라이언트) 다르게 행동한다는 것입니다.
  2. 다른 클라이언트를 사용하여 오류없이 데이터 전송 프로세스를 중단 할 수 있습니다.
  3. 클라이언트의 동작은 내가 보낸 메시지에 따라 다릅니다.
  4. Nautilus로 전송을 중단하면 정상적으로 작동하며 오류가없고 누출이 없습니다. 그러나 gftp 클라이언트의 경우 클라이언트는 첫 번째 메시지를 수신 한 다음 제어 연결을 닫습니다. 그런 다음 서버는 두 번째 메시지를 클라이언트로 보냅니다. 그 후 서버는 클라이언트로부터 무언가를 받기로되어 있지만, 그런 일이 발생하면 오류와 많은 mem 누수가 발생합니다. 닫힌 소켓에서 읽는 것이 오류를 일으키지 만 전체 프로그램을 중단 시켜서는 안된다는 것을 알고 있습니다.
  5. 나는 GPT 클라이언트를위한 낙태 수술을하려고 노력했고 유일한 (부분) 해결책은 단지 두 번째 메시지만을 보내는 것이었다. (글쎄, 나는 그것이 중요한 것은 하나만 보내면 문제가되지 않는다고 생각한다. 그들). 그 후에도 아무런 오류도없고 누출도 없었습니다. 남은 유일한 문제는 클라이언트가 여전히 제어 연결을 닫았다는 것입니다. 클라이언트가 분명히 연결을 끊었으므로 (gftp 클라이언트가 "사이트 localhost에서 연결 해제"라고 썼음) 서버가 닫은 후 gftp가 "오류 : 원격 사이트 localhost 연결이 끊어졌습니다. 초 ".
  6. 그러나 해결책에는 부작용이있었습니다. 노틸러스 클라이언트가 작동을 멈췄습니다. 클라이언트는 메시지를 수신했지만 메시지 하나를 보냈기 때문에 다른 메시지를 기다리고있었습니다 (또는 그렇게 생각합니다).
  7. 제 질문은 두 클라이언트 모두에게 어떻게 작동시키는 것이 가능합니까? 내가 가지고있는 유일한 생각은 아마도 회신 코드가 잘못되었다는 것입니다. 문제가 어디에 있는지 말해줘.

감사

+1

"메모를 통해 코드 유지 관리"학교에서 : WriteToLog (".."); // 로그에 쓰기' –

+0

귀하의 질문은 매우 읽기가 어렵습니다. 여러 부분으로 다시 쓸 수 있습니까? 대략 그와 비슷한 것 : 1) 문맥 2) 당신이하려는 일 (높은 수준) 3) 어떻게하려고하는지 4) 문제가 무엇인지 5) 문제를 해결하기 위해 지금까지 시도한 것. 이렇게하면 훨씬 더 많은 사람들이 대답 할 수 있습니다! 고마워, 나중에 살펴볼 게. – Offirmo

+0

ABOR 명령을 보내야하는 클라이언트가 아닌 대답입니까? 서버의 코드 또는 클라이언트를 표시하는 코드입니까? 또는 혼합? – Offirmo

답변

0

확인은, 먼저 해당합니다

I get an error and a ton of mem leaks. I know that reading from closed socket gives error but it shouldn't crash the whole program

그래서 예 :

  • 당신이 오류에 저항해야한다 : 체계적으로 리턴 코드를 확인하고 정확하게 처리
  • 메모리 누수가 없어야합니다. 스마트 포인터를 사용하여 사용하지 않는 메모리 블록은 일반적인 방식으로, 또한

해방되고 :

  • 서버가 클라이언트가 제대로 작동 할 것으로 예상해서는 안됩니다. 반대로, 클라이언트는 버그가 있거나 심지어 보안 성이 있다고 가정해야합니다. 따라서 고객이 응답하지 않으면 시간 초과가 발생합니다.
  • 클라이언트가 사양을 따르지는 않지만 여전히 작동해야하는 경우 (큰 시장 점유율)이 클라이언트를 인식하고 그에 따라 작동하는 방법을 찾아야합니다.

그 후, 나는 당신의 문제를 잘 이해하지 못합니다. 그래서 내 의견을보고 나는이 대답을 업데이 트합니다.