2009-04-23 3 views
2

서버에서 클라이언트로 파일을 전송하는 C 클라이언트/서버 프로그램이 있습니다.소켓 : 마지막 바이트를 수신 한 후에도 클라이언트가 대기 중임

그러나 클라이언트는 파일의 마지막 바이트를받은 후에도 recv를 기다리고 있습니다. 클라이언트가 죽이거나 서버가 나를 죽인 경우에만 클라이언트가 종료됩니다. 그러나 서버는 다른 클라이언트의 요청을 즐겁게하기 위해 루프에 있어야합니다.

각 클라이언트의 요청을 받아들이려면 서버에 fork()을 사용하고 있습니다. 나는 클라이언트의 요청이 환영받은 후에 자식 프로세스를 종료하지만 클라이언트는 전체 서버 프로그램이 종료 될 때만 종료됩니다.

서버의 자식이 종료 될 때 클라이언트가 종료되지 않는 이유는 무엇입니까?

서버 코드 here과 클라이언트 코드 here을 볼 수 있습니다.

+2

무엇이 질문입니까? – JRL

+0

유효한 질문에 대한 이유없이 -1을주는 @JRL은 매우 나쁘다!, 질문은 정확합니다. –

+0

@Akash : 당신이하는 말을 이해하지 못합니다. 내가 -1을 준다고 말한다면, 당신은 틀렸어. 그렇지 않았다. 나는 그의 질문이 무엇인지 질문했다. – JRL

답변

3

당신은 shutdown(s, SHUT_WR 전화 있는지 확인해야합니다)를 보냈습니다.

shutdown()을 호출하면 보낼 데이터가 더 이상 없음을 TCP 계층에 알립니다.

TBH, 나는 왜 전화 번호 close()을 호출하는 것이 그렇게되지 않는지 확실히 알지 못합니다.

EDIT - 이제 그 점을 알아 냈습니다. 코드의 해당 시점에 부모가 여전히 소켓을 열어 커널에 의해 찢어지지 않았기 때문입니다. fork() 후 몇 가지 여분의 논리를 추가하는 경우 :

if (p > 0) { 
    close(connected); 
} 

그런 다음 코드는 shutdown()를 호출하지 않고 작동합니다.

어제의 질문에 my answer에 보낸 코드를 사용하는 경우 클라이언트는 bytes_received 카운트를 가져온 다음 루프를 종료합니다.

+0

은 부모와 자녀가 공유하는 파일이 아니므로 가까이에 아이가 연결되어 있으면 작동한다고 생각합니다. 그런데 한 번 클라이언트가 0 바이트를 수신하면 루프가 나오고 마침내 종료됩니다.하지만 그 일은 일어나지 않습니다. 자식도 all.i hv를 수신 한 후에도 기다리고 있습니다. 서버가 죽을 때까지 아무 것도 보여주지 않습니다! – mawia

+0

아니요, 파일은 공유되지만 파일 설명자는 별도입니다. 자식에서 그것을 닫으면 여전히 부모 노드가 열려 있습니다. 파일이 여전히 열려 있기 때문에 서버는 스트림 끝 (end-of-stream)에 길이가 0 인 표시기를 보내지 않습니다. 위 코드를 서버 프로그램에 추가하면 모든 것이 잘 동작합니다. – Alnitak

0

다음과 같이 호출해야합니다. shutdown (s, SD_SEND); closesocket (s);

서버에서 파일을 보낸 후 소켓을 닫습니다.

0

이것은 약간 힘들고 세부 사항이 더 좋을 것입니다. TCP/IP를 사용하고 있습니까? 파일 전송에 대해 이야기하고 있으므로 TCP라고 가정합니다.

클라이언트에 연결된 소켓을 소유하는 서버 측에서 프로세스를 종료하면 연결이 종료됩니다. 클라이언트의 recv() 호출이 끝나면 -1 (또는 100 % 확실하지 않은 0)을 반환합니다. 그렇게하지 않으면 주 서버 프로세스에서 소켓을 명시 적으로 닫습니다 (소켓 소유권을 어떻게 설정했는지 확실하지 않음). 독서 소켓의 두 가지 방법이 있습니다

-1

...

  1. RECV()와 바이트로 바이트를 수신하지만 내용이 포함 된 경우 문제는 -1 데이터의 중간에 그 때의 끝을 표시합니다 파일.

  2. 또 다른 방법은 스트림에서 버퍼를 읽는 것입니다.이 메서드는 스트림에서 읽은 바이트 수를 반환하고 반환 값이 0이면 스트림 끝을 의미합니다. 서버 프로세스에 close(s)에 의해 한 번에 모든 데이터를 다음

+0

-1 파일의 중간에있는 약점 -1에 대해 – Alnitak

+0

바이트 당 하나의 함수 호출이 참으로 짜증납니다! 당신은 그것보다 더 잘 할 필요가 있습니다. 답장을 보내 주셔서 감사합니다. –

관련 문제