서버와 데이터를 주고 받는 도중 closesocket을 햇을때 select서버가 클로즈 시그널을 못잡습니다.
글쓴이: ehaakdl / 작성시간: 화, 2016/07/19 - 2:12오전
서버와 데이터를 주고 받는 도중 클라이언트에서 closesocket을 햇을때 select서버가 FD_CLOSE 시그널을 못잡습니다.
closesocket이전에 PAUSE나 sleep을 줘서 텀을 발생 시켯을떄는 잘 종료가 됩니다.
서버쪽에서 WSAWaitForMultipleEvents 함수의 반환값으로 어떤 인덱스에서 시그널이 발생 햇다고는 하는데 구체적인 FD_CLOSE나
FD_READ시그널등을 잡지 못해 예외 처리에 불편을 껶고 있습니다.
그 이후 다시 close가 실패한 서버에 소켓으로 recv를 해보면 반환값으로 10054에러가 나오는데 어째서 FD_CLOSE 시그널로 안들
어가는지 궁금합니다.
그리고 또 하나 궁금한것이 있는대 다른 데이터들이 먼저 보내져 있는 상황에 closesocket을 호출 하면 그 순간 바로 전자에 애
기했던 상황이 벌어집니다. 분명 제가 FD_READ 발생할때마다 printf로 출력을 시켜 놓는데 왜 그런 걸까요?
Forums:
비슷한 내용이 있네요.
WSAWaitForMultipleEvents
http://ozt88.tistory.com/22
반환 값에서 상수 값 WSA_WAIT_EVENT_0을 빼면 2번째 인자 배열 기준 인덱스를 얻을 수 있다. 여러개가 signaled되면 더 작은 인덱스 값이 반환된다. 동시에 여러 이벤트 오브젝트가 signaled 되면 그 시점에서는 알 수 없지만, manual-reset모드이므로 이벤트 오브젝트의 signal이 유지된 상태이기 때문에 다시 한번 WSAWaitForMultipleEvents로 0 딜레이 체크를 해주면 된다.
WSAENETDOWN
10050
Network is down.
A socket operation encountered a dead network. This could indicate a serious failure of the network system (that is, the protocol stack that the Windows Sockets DLL runs over), the network interface, or the local network itself.
네트워크가 다운되었습니다.
소켓 작업은 죽은 네트워크가 발생했습니다. 이는 네트워크 시스템의 심각한 고장을 나타낼 수있다 (즉, Windows 소켓 DLL을 통해 실행되는 프로토콜 스택), 네트워크 인터페이스 또는 로컬 네트워크.
WSAECONNRESET
10054
Connection reset by peer.
An existing connection was forcibly closed by the remote host. This normally results if the peer application on the remote host is suddenly stopped, the host is rebooted, the host or remote network interface is disabled, or the remote host uses a hard close (see setsockopt for more information on the SO_LINGER option on the remote socket). This error may also result if a connection was broken due to keep-alive activity detecting a failure while one or more operations are in progress. Operations that were in progress fail with WSAENETRESET. Subsequent operations fail with WSAECONNRESET.
연결 피어에 의해 재설정합니다.
기존 연결은 원격 호스트에 의해 강제로 끊겼습니다. 원격 호스트의 피어 응용 프로그램이 갑자기 정지하는 경우는 일반적으로 호스트를 재부팅 할 때, 결과, 호스트 또는 원격 네트워크 인터페이스를 사용할 수 없습니다, 또는 원격 호스트 하드 닫기 (원격에서 SO_LINGER 옵션에 대한 자세한 내용은 setsockopt를 참조 사용 소켓). 연결이 연결 유지하는 활동을 하나 이상의 작업이 진행되는 동안 오류를 검출 인해 파손 된 경우에도이 오류가 발생할 수 있습니다. 진행중인 작업은 WSAENETRESET 함께 실패합니다. 후속 작업은 WSAECONNRESET 함께 실패합니다.
Non-Blocking Sockets in TCP/IP (The Client)
http://www.win32developer.com/tutorial/winsock/winsock_tutorial_3.shtm
WSAAsyncSelect function
https://msdn.microsoft.com/en-us/library/windows/desktop/ms741540(v=vs.85).aspx
WSAEventSelect function
https://msdn.microsoft.com/ko-kr/library/windows/desktop/ms741576(v=vs.85).aspx
WSAWaitForMultipleEvents
http://www.joinc.co.kr/w/man/4100/WASWaitForMultipleEvents
WSAWaitForMultipleEvents 함수는 이벤트 객체의 전부 혹은 하나의 신호 상태, 제한 시간 혹은 완료 루틴 (completion routine)의 실행시 반환 한다.
WSAWaitForMultipleEvents function
https://msdn.microsoft.com/ko-kr/library/windows/desktop/ms742219(v=vs.85).aspx
Windows Sockets Error Codes
https://msdn.microsoft.com/en-us/library/windows/desktop/ms740668(v=vs.85).aspx
WSAGetLastError function
https://msdn.microsoft.com/en-us/library/windows/desktop/ms741580(v=vs.85).aspx
recv function
https://msdn.microsoft.com/en-us/library/windows/desktop/ms740121(v=vs.85).aspx
10054
서버측 무한 뤂 현상 질문입니다.
https://kldp.org/node/149198
10054
TCP 이상 연결 종료에 관한 질문입니다.
https://kldp.org/node/88487
----------------------------------------------------------------------------
젊음'은 모든것을 가능하게 만든다.
매일 1억명이 사용하는 프로그램을 함께 만들어보고 싶습니다.
정규 근로 시간을 지키는. 야근 없는 회사와 거래합니다.
각 분야별. 좋은 책'이나 사이트' 블로그' 링크 소개 받습니다. shintx@naver.com
??
??
close()
close() 직전에
shutdown(socketfd,SHUT_RDWR) 해보세요. 인수 중 첫번째 socketfd는 그대로 타자 치는게 아니라 소켓 디스크립터가 들어가는 자리입니다.
자세한 방법은 man 2 shutdown 보시면 나옵니다.
Written By the Black Knight of Destruction
댓글 달기