클라이언트 소켓을 NONBLOCK으로 열었을때..
. . . read_size = read(server_sockfd, read_buf, sizeof(read_buf)); if(read_size == -1) continue; //읽어올 데이타가 없을때 . . .
서버가 종료 했을 때에는 어떻게 알수 있나요.?
NONBLOCK 모드로 read()함수 수행시 소켓연결은 유지된 상태에서 단순히 읽어올 데이터가 없을 경우에는 errno가 EAGAIN으로 셋팅됩니다.
리턴값이 -1일때 errno가 EAGAIN이라면 continue 그렇지 않을 경우 소켓 연결이 끊기거나 에러가 발생했다고 보시면 될겁니다.
.지우.
s(˘∼˘*)z,·´″"`°³о$ √(´∀`√)... (˘ヘ˘ㆀ)a
TCP connection 이 끊긴 경우
read() 는 0 return(EOF의 의미) write()는 -1 return, errno == EPIPE 입니다.
nonblocking 이고 읽을 데이터가 없는 경우 read()는 -1 return, errno == EAGAIN 입니다.
read/write 시에는 interrupt 가 발생할 수 있으므로, 항상 return 값이 -1이고 errno == EINT 에 대해 처리해 주어야 합니다.
또 한번의 read() 호출로 모든 data를 read 한다는 보장이 없으므로, 원하는 길이만큼 읽을 때까지 looping 처리 해야 합니다.
우리 모두 리얼리스트가 되자. 그러나 가슴에 이룰 수 없는 꿈을 가지자
사족을 더 답니다.
write의 경우도 카운트를 계산하셔서,
모두 쓰여졌는지 확인을 하시는것이 좋을 것입니다.
한가지 더, 일반적으로 non blocking I/O를 사용할 때는
busy wait 상태를 피하기 위해
select 혹은 poll을 이용하여 Event를 검사하는 방식으로
CPU를 계속 점유하지 않게 합니다.
코딩해 보시면, 생각보다는 쪼금 더 복잡할 수도 있을 겁니다.
특히, Portability 문제도 간혹 생기실 것이구요.(특히 AIX)
즐컴하시길.
고도의 추상화, 극도의 구체화, 에디슨을 그리워하다.
peer가 connect 된 socket을 close 한 경우에
peer가 SO_LINGER 옵션을 키고 시간을 0로 설정한 경우라면 결과가 다르게 나옵니다.
read/write 모두 return -1 , errno==ECONNRESET(104번) 입니다.
peer가 rebooting 하는 경우에도 위와 동일합니다.
텍스트 포맷에 대한 자세한 정보
<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]
NONBLOCK 모드로 read()함수 수행시 소켓연결은 유지된 상태에서
NONBLOCK 모드로 read()함수 수행시 소켓연결은 유지된 상태에서
단순히 읽어올 데이터가 없을 경우에는 errno가 EAGAIN으로 셋팅됩니다.
리턴값이 -1일때 errno가 EAGAIN이라면 continue
그렇지 않을 경우 소켓 연결이 끊기거나 에러가 발생했다고 보시면 될겁니다.
.지우.
s(˘∼˘*)z,·´″"`°³о$ √(´∀`√)... (˘ヘ˘ㆀ)a
TCP connection 이 끊긴 경우read() 는 0 ret
TCP connection 이 끊긴 경우
read() 는 0 return(EOF의 의미)
write()는 -1 return, errno == EPIPE 입니다.
nonblocking 이고 읽을 데이터가 없는 경우 read()는 -1 return, errno == EAGAIN 입니다.
read/write 시에는 interrupt 가 발생할 수 있으므로, 항상 return 값이 -1이고 errno == EINT 에 대해 처리해 주어야 합니다.
또 한번의 read() 호출로 모든 data를 read 한다는 보장이 없으므로, 원하는 길이만큼 읽을 때까지 looping 처리 해야 합니다.
우리 모두 리얼리스트가 되자. 그러나 가슴에 이룰 수 없는 꿈을 가지자
NonBlocking I/O
사족을 더 답니다.
write의 경우도 카운트를 계산하셔서,
모두 쓰여졌는지 확인을 하시는것이 좋을 것입니다.
한가지 더, 일반적으로 non blocking I/O를 사용할 때는
busy wait 상태를 피하기 위해
select 혹은 poll을 이용하여 Event를 검사하는 방식으로
CPU를 계속 점유하지 않게 합니다.
코딩해 보시면, 생각보다는 쪼금 더 복잡할 수도 있을 겁니다.
특히, Portability 문제도 간혹 생기실 것이구요.(특히 AIX)
즐컴하시길.
고도의 추상화, 극도의 구체화, 에디슨을 그리워하다.
LINGER 시간을 0으로 한 경우...
peer가 connect 된 socket을 close 한 경우에
peer가 SO_LINGER 옵션을 키고 시간을 0로 설정한 경우라면 결과가 다르게 나옵니다.
read/write 모두 return -1 , errno==ECONNRESET(104번) 입니다.
peer가 rebooting 하는 경우에도 위와 동일합니다.
우리 모두 리얼리스트가 되자. 그러나 가슴에 이룰 수 없는 꿈을 가지자
댓글 달기