fblocked — 마지막 입력 연산이 가용 입력을 모두 소진했는지 테스트하기

fblocked — 마지막 입력 연산이 가용 입력을 모두 소진했는지 테스트하기

네트워크 서버를 만들다 보면 한 줄씩 데이터를 받으면서도 다른 연결을 계속 처리하고 싶을 때가 있어요. 그럴 때 비차단 방식으로 데이터가 완전히 들어왔는지, 아직 줄 끝을 기다리는 건지 구분할 필요가 있어요. 그때 쓰는 명령이 fblocked예요.

출처: Tcl 공식 문서 — fblocked

본문

시그니처

fblocked channelId

설명

fblocked 명령은 channelId에 대한 가장 최근 입력 연산이 요청보다 적은 정보를 반환했는데 그 이유가 가용 입력이 모두 소진됐기 때문이면 1을 반환해요. 예를 들어 입력에 3문자만 있고 줄 끝 시퀀스가 없을 때 gets를 호출하면 gets는 빈 문자열을 반환하고, 이어지는 fblocked 호출은 1을 반환해요.

channelId는 표준 채널(stdin, stdout, stderr), open·socket 호출의 반환값, 또는 Tcl 확장이 제공한 채널 생성 명령의 결과처럼 열려 있는 채널의 식별자여야 해요.

예제

fblocked 명령은 네트워크 서버를 작성할 때 특히 유용해요. 한 줄씩 스타일로 코드를 쓰면서도 다른 연결을 서비스하는 것을 막지 않기 때문이에요. 간단한 에코 서비스에서 볼 수 있어요:

# This is called whenever a new client connects to the server
proc connect {chan host port} {
 set clientName [format <%s:%d> $host $port]
 puts "connection from $clientName"
 fconfigure $chan -blocking 0 -buffering line
 fileevent $chan readable [list echoLine $chan $clientName]
}

# This is called whenever either at least one byte of input
# data is available, or the channel was closed by the client.
proc echoLine {chan clientName} {
 gets $chan line
 if {[eof $chan]} {
 puts "finishing connection from $clientName"
 close $chan
 } elseif {![fblocked $chan]} {
 # Didn't block waiting for end-of-line
 puts "$clientName - $line"
 puts $chan $line
 }
}

# Create the server socket and enter the event-loop to wait
# for incoming connections...
socket -server connect 12345
vwait forever

더 알아보기

  • gets, open, read, socket, Tcl_StandardChannels
  • 키워드: blocking, nonblocking