2013-02-08 2 views
0

저는 tcp-ip 스택, 서버 클라이언트 연결을 배우고 있습니다. 나는 간단한 클라이언트 서버를 썼다. 클라이언트와 서버는 아무런 문제없이 데이터를 서로 전송할 수있었습니다. 동일한 컴퓨터에서 클라이언트와 서버를 실행하고 있습니다. ctrl + c를 사용하여 서버를 닫았을 때 커널이 FIN 대신 RST 신호를 보내고 있음을 발견했습니다. (제 질문을 참조하십시오 : Active closure of server sockets)서버가 FIN 대신 재설정 신호를 전송합니다.

좀 더 많은 조사를 통해 클라이언트 중 하나가 읽기 호출에 있었고 해당 서버 스레드가 무한 루프 였음을 알았습니다. 루프는 아무 것도하지 않았습니다 (일부 버그는 멍청한 코딩). 그러나 루프를 끝내면서 무한 루프를 제거하면 예상되는 동작을 보았습니다. FIN이 양방향으로 보내지는 것을 볼 수있었습니다.

그래서, 왜 tcp 계층이 첫 번째 경우에 RST를 전송했는지 궁금합니다.

답변

0

결국 상대방이 데이터를 수락 할 때까지 기다리십시오.

+0

링크 된 질문에서 내 tcpdump가 표시되면 FIN 패킷이 없습니다. 그래서 서버 측 소켓처럼 보낸 적이없는 것 같습니다 – user2026599

+0

결국 누가 포기합니까? 그리고 상대방이 데이터를 받아들이지 않는다는 증거는 어디에 있습니까? – EJP

+0

결국 데이터를 전송하는 측은 정상적인 종료 시도를 포기합니다. 피어는 끝없는 루프에 갇혀 있었기 때문에 데이터를받지 못했습니다. 이 시점에서, 송신 측은 RST를 보내고 다른 측의 읽기는 오류를 반환합니다. –

관련 문제