서버와 데이터를 주고 받는 도중 closesocket을 햇을때 select서버가 클로즈 시그널을 못잡습니다.

ehaakdl의 이미지

서버와 데이터를 주고 받는 도중 클라이언트에서 closesocket을 햇을때 select서버가 FD_CLOSE 시그널을 못잡습니다.

closesocket이전에 PAUSE나 sleep을 줘서 텀을 발생 시켯을떄는 잘 종료가 됩니다.

서버쪽에서 WSAWaitForMultipleEvents 함수의 반환값으로 어떤 인덱스에서 시그널이 발생 햇다고는 하는데 구체적인 FD_CLOSE나

FD_READ시그널등을 잡지 못해 예외 처리에 불편을 껶고 있습니다.

그 이후 다시 close가 실패한 서버에 소켓으로 recv를 해보면 반환값으로 10054에러가 나오는데 어째서 FD_CLOSE 시그널로 안들

어가는지 궁금합니다.

그리고 또 하나 궁금한것이 있는대 다른 데이터들이 먼저 보내져 있는 상황에 closesocket을 호출 하면 그 순간 바로 전자에 애

기했던 상황이 벌어집니다. 분명 제가 FD_READ 발생할때마다 printf로 출력을 시켜 놓는데 왜 그런 걸까요?

shint의 이미지


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

ehaakdl의 이미지

??

Necromancer의 이미지

close() 직전에
shutdown(socketfd,SHUT_RDWR) 해보세요. 인수 중 첫번째 socketfd는 그대로 타자 치는게 아니라 소켓 디스크립터가 들어가는 자리입니다.

자세한 방법은 man 2 shutdown 보시면 나옵니다.

Written By the Black Knight of Destruction

댓글 달기

Filtered HTML

  • 텍스트에 BBCode 태그를 사용할 수 있습니다. URL은 자동으로 링크 됩니다.
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param><hr>
  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.

BBCode

  • 텍스트에 BBCode 태그를 사용할 수 있습니다. URL은 자동으로 링크 됩니다.
  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param>
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.

Textile

  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • You can use Textile markup to format text.
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param><hr>

Markdown

  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • Quick Tips:
    • Two or more spaces at a line's end = Line break
    • Double returns = Paragraph
    • *Single asterisks* or _single underscores_ = Emphasis
    • **Double** or __double__ = Strong
    • This is [a link](http://the.link.example.com "The optional title text")
    For complete details on the Markdown syntax, see the Markdown documentation and Markdown Extra documentation for tables, footnotes, and more.
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param><hr>

Plain text

  • HTML 태그를 사용할 수 없습니다.
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.
  • 줄과 단락은 자동으로 분리됩니다.
댓글 첨부 파일
이 댓글에 이미지나 파일을 업로드 합니다.
파일 크기는 8 MB보다 작아야 합니다.
허용할 파일 형식: txt pdf doc xls gif jpg jpeg mp3 png rar zip.
CAPTCHA
이것은 자동으로 스팸을 올리는 것을 막기 위해서 제공됩니다.