The Socket 구조
The Socket 구조
소켓은 네트워크 통신의 기본적인 추상화예요. 소켓 구조는 소켓 주소, 타입, 그리고 소켓 생성·제어·통신 함수를 정의해요.
출처: 문서
본문
시놉시스 (Synopsis)
signature SOCKET (* OPTIONAL *)
structure Socket :> SOCKET (* OPTIONAL *)
인터페이스 (Interface)
type ('af,'sock_type) sock
type 'af sock_addr
type dgram
type 'mode stream
type passive
type active
structure AF : sig
type addr_family = NetHostDB.addr_family
val list : unit -> (string * addr_family) list
val toString : addr_family -> string
val fromString : string -> addr_family option
end
structure SOCK : sig
eqtype sock_type
val stream : sock_type
val dgram : sock_type
val list : unit -> (string * sock_type) list
val toString : sock_type -> string
val fromString : string -> sock_type option
end
structure Ctl : sig
val getDEBUG : ('af, 'sock_type) sock -> bool
val setDEBUG : ('af, 'sock_type) sock * bool -> unit
val getREUSEADDR : ('af, 'sock_type) sock -> bool
val setREUSEADDR : ('af, 'sock_type) sock * bool
-> unit
val getKEEPALIVE : ('af, 'sock_type) sock -> bool
val setKEEPALIVE : ('af, 'sock_type) sock * bool
-> unit
val getDONTROUTE : ('af, 'sock_type) sock -> bool
val setDONTROUTE : ('af, 'sock_type) sock * bool
-> unit
val getLINGER : ('af, 'sock_type) sock
-> Time.time option
val setLINGER : ('af, 'sock_type) sock
* Time.time option -> unit
val getBROADCAST : ('af, 'sock_type) sock -> bool
val setBROADCAST : ('af, 'sock_type) sock * bool
-> unit
val getOOBINLINE : ('af, 'sock_type) sock -> bool
val setOOBINLINE : ('af, 'sock_type) sock * bool
-> unit
val getSNDBUF : ('af, 'sock_type) sock -> int
val setSNDBUF : ('af, 'sock_type) sock * int -> unit
val getRCVBUF : ('af, 'sock_type) sock -> int
val setRCVBUF : ('af, 'sock_type) sock * int -> unit
val getTYPE : ('af, 'sock_type) sock -> SOCK.sock_type
val getERROR : ('af, 'sock_type) sock -> bool
val getPeerName : ('af, 'sock_type) sock
-> 'af sock_addr
val getSockName : ('af, 'sock_type) sock
-> 'af sock_addr
val getNREAD : ('af, 'sock_type) sock -> int
val getATMARK : ('af, active stream) sock -> bool
end
val sameAddr : 'af sock_addr * 'af sock_addr -> bool
val familyOfAddr : 'af sock_addr -> AF.addr_family
val bind : ('af, 'sock_type) sock * 'af sock_addr -> unit
val listen : ('af, passive stream) sock * int -> unit
val accept : ('af, passive stream) sock
-> ('af, active stream) sock * 'af sock_addr
val acceptNB : ('af, passive stream) sock
-> (('af, active stream) sock
* 'af sock_addr) option
val connect : ('af, 'sock_type) sock * 'af sock_addr
-> unit
val connectNB : ('af, 'sock_type) sock * 'af sock_addr
-> bool
val close : ('af, 'sock_type) sock -> unit
datatype shutdown_mode
= NO_RECVS
| NO_SENDS
| NO_RECVS_OR_SENDS
val shutdown : ('af, 'mode stream) sock * shutdown_mode
-> unit
type sock_desc
val sockDesc : ('af, 'sock_type) sock -> sock_desc
val sameDesc : sock_desc * sock_desc -> bool
val select : {
rds : sock_desc list,
wrs : sock_desc list,
exs : sock_desc list,
timeout : Time.time option
}
-> {
rds : sock_desc list,
wrs : sock_desc list,
exs : sock_desc list
}
val ioDesc : ('af, 'sock_type) sock -> OS.IO.iodesc
type out_flags = {don't_route : bool, oob : bool}
type in_flags = {peek : bool, oob : bool}
val sendVec : ('af, active stream) sock
* Word8VectorSlice.slice -> int
val sendArr : ('af, active stream) sock
* Word8ArraySlice.slice -> int
val sendVec' : ('af, active stream) sock
* Word8VectorSlice.slice
* out_flags -> int
val sendArr' : ('af, active stream) sock
* Word8ArraySlice.slice
* out_flags -> int
val sendVecNB : ('af, active stream) sock
* Word8VectorSlice.slice -> int option
val sendVecNB' : ('af, active stream) sock
* Word8VectorSlice.slice
* out_flags -> int option
val sendArrNB : ('af, active stream) sock
* Word8ArraySlice.slice -> int option
val sendArrNB' : ('af, active stream) sock
* Word8ArraySlice.slice
* out_flags -> int option
val recvVec : ('af, active stream) sock * int
-> Word8Vector.vector
val recvVec' : ('af, active stream) sock * int * in_flags
-> Word8Vector.vector
val recvArr : ('af, active stream) sock
* Word8ArraySlice.slice -> int
val recvArr' : ('af, active stream) sock
* Word8ArraySlice.slice
* in_flags -> int
val recvVecNB : ('af, active stream) sock * int
-> Word8Vector.vector option
val recvVecNB' : ('af, active stream) sock * int * in_flags
-> Word8Vector.vector option
val recvArrNB : ('af, active stream) sock
* Word8ArraySlice.slice -> int option
val recvArrNB' : ('af, active stream) sock
* Word8ArraySlice.slice
* in_flags -> int option
val sendVecTo : ('af, dgram) sock
* 'af sock_addr
* Word8VectorSlice.slice -> unit
val sendArrTo : ('af, dgram) sock
* 'af sock_addr
* Word8ArraySlice.slice -> unit
val sendVecTo' : ('af, dgram) sock
* 'af sock_addr
* Word8VectorSlice.slice
* out_flags -> unit
val sendArrTo' : ('af, dgram) sock
* 'af sock_addr
* Word8ArraySlice.slice
* out_flags -> unit
val sendVecToNB : ('af, dgram) sock
* 'af sock_addr
* Word8VectorSlice.slice -> bool
val sendVecToNB' : ('af, dgram) sock
* 'af sock_addr
* Word8VectorSlice.slice
* out_flags -> bool
val sendArrToNB : ('af, dgram) sock
* 'af sock_addr
* Word8ArraySlice.slice -> bool
val sendArrToNB' : ('af, dgram) sock
* 'af sock_addr
* Word8ArraySlice.slice
* out_flags -> bool
val recvVecFrom : ('af, dgram) sock * int
-> Word8Vector.vector
* 'sock_type sock_addr
val recvVecFrom' : ('af, dgram) sock * int * in_flags
-> Word8Vector.vector
* 'sock_type sock_addr
val recvArrFrom : ('af, dgram) sock
* Word8ArraySlice.slice
-> int * 'af sock_addr
val recvArrFrom' : ('af, dgram) sock
* Word8ArraySlice.slice
* in_flags -> int * 'af sock_addr
val recvVecFromNB : ('af, dgram) sock * int
-> (Word8Vector.vector
* 'sock_type sock_addr) option
val recvVecFromNB' : ('af, dgram) sock * int * in_flags
-> (Word8Vector.vector
* 'sock_type sock_addr) option
val recvArrFromNB : ('af, dgram) sock
* Word8ArraySlice.slice
-> (int * 'af sock_addr) option
val recvArrFromNB' : ('af, dgram) sock
* Word8ArraySlice.slice
* in_flags
-> (int * 'af sock_addr) option
설명 (Description)
type ('af,'sock_type) sock
소켓의 타입 스킴이에요. 타입 매개변수 'mode는 active 또는 passive로 인스턴스화돼요.
type 'af sock_addr
소켓의 주소 타입이에요.
type dgram
socket은 지정된 주소 패밀리와 소켓 타입의 소켓을 만들어요.
type 'mode stream
bind는 소켓을 주소에 묶고, connect는 연결하고, listen은 연결 요청을 받을 준비를 해요.
structure AF
accept는 수신 대기 소켓에서 연결을 받아들여 활성 소켓을 돌려줘요.
val list : unit -> (string * addr_family) list
recv·send는 연결된 소켓에서 데이터를 받고 보내요.
val toString : addr_family -> string
val fromString : string -> addr_family option
select는 소켓 집합의 I/O 준비 상태를 조사해요.
structure SOCK
소켓 주소 패밀리와 타입을 나타내는 값이에요.
eqtype sock_type
소켓 타입의 타입이에요.
val stream : sock_type
스트림 소켓 타입 값이에요.
val dgram : sock_type
데이터그램 소켓 타입 값이에요.
val list : unit -> (string * sock_type) list
이용 가능한 소켓 타입 목록이에요. 목록의 각 요소는 (name,sty) 형태인데, name은 소켓 타입 이름이고 sty는 실제 소켓 타입 값이에요. 가능한 소켓 타입 이름 목록에는 스트림 소켓용 "STREAM", 데이터그램 소켓용 "DGRAM", raw 소켓용 "RAW"가 포함돼요. 이 이름들은 C API의 기호 상수를 가져와 앞의 ``SOCK_.''을 제거해 형성돼요.
val toString : sock_type -> string
val fromString : string -> sock_type option
이들은 소켓 타입 값과 그 이름(예: "STREAM") 사이를 변환해요. 이름에 해당하는 소켓 타입 값이 없으면 fromString은 NONE을 돌려줘요. (name,sty) 쌍이 list가 돌려주는 목록에 있으면 name이 toString(sty)와 같다는 것이 성립해요.
structure Ctl
Ctl 하위구조는 소켓과 연관된 옵션을 조작하는 지원을 제공해요. 이 함수들은 인자 소켓이 닫혔을 때 SysErr 예외를 발생시켜요.
val getDEBUG : ('af, 'sock_type) sock -> bool
val setDEBUG : ('af, 'sock_type) sock * bool -> unit
이 함수들은 소켓의 SO_DEBUG 플래그를 조회하고 설정해요. 이 플래그는 커널 내의 저수준 디버깅을 활성화하거나 비활성화해요. 활성화되면 커널이 최근에 수신되거나 전송된 패킷의 기록을 유지할 수 있게 해줘요.
val getREUSEADDR : ('af, 'sock_type) sock -> bool
val setREUSEADDR : ('af, 'sock_type) sock * bool -> unit
이들은 소켓의 SO_REUSEADDR 플래그를 조회하고 설정해요. true일 때 이 플래그는 시스템이 bind 호출에서 로컬 소켓 주소의 재사용을 허용하도록 지시해요.
val getKEEPALIVE : ('af, 'sock_type) sock -> bool
val setKEEPALIVE : ('af, 'sock_type) sock * bool -> unit
이들은 소켓의 SO_KEEPALIVE 플래그를 조회하고 설정해요. true일 때 시스템은 다른 데이터가 교환되지 않고 있을 때 연결된 소켓에서 주기적 전송을 생성해요.
val getDONTROUTE : ('af, 'sock_type) sock -> bool
val setDONTROUTE : ('af, 'sock_type) sock * bool -> unit
이들은 소켓의 SO_DONTROUTE 플래그를 조회하고 설정해요. 이 플래그가 true이면 나가는 메시지가 기본 프로토콜의 일반 라우팅 메커니즘을 우회하고, 대신 목적지 주소의 네트워크 부분이 지정한 대로 적절한 네트워크 인터페이스로 향해요. 이 옵션은 sendVec', sendArr', sendVecTo', sendArrTo' 함수 중 하나를 사용해 메시지별로 지정할 수 있다는 점에 유의하세요.
val getLINGER : ('af, 'sock_type) sock -> Time.time option
val setLINGER : ('af, 'sock_type) sock * Time.time option
-> unit
이 함수들은 소켓 sock의 SO_LINGER 플래그를 조회하고 설정해요. 이 플래그는 소켓에 전송되지 않은 메시지가 큐에 있고 닫기가 수행될 때 취해지는 조치를 제어해요. 플래그가 NONE으로 설정되면 시스템은 필요한 경우 데이터를 버리며 가능한 한 빨리 소켓을 닫아요. 플래그가 SOME(t)으로 설정되고 소켓이 안정적인 전달을 약속하면 시스템은 데이터가 전달되거나 타임아웃 t가 만료될 때까지 닫기 연산을 차단해요. t가 음수이거나 너무 크면 Time이 발생해요.
val getBROADCAST : ('af, 'sock_type) sock -> bool
val setBROADCAST : ('af, 'sock_type) sock * bool -> unit
이들은 소켓 sock의 SO_BROADCAST 플래그를 조회하고 설정해요. 이 플래그는 프로세스가 소켓으로 브로드캐스트 메시지를 보내는 능력을 활성화하거나 비활성화해요.
val getOOBINLINE : ('af, 'sock_type) sock -> bool
val setOOBINLINE : ('af, 'sock_type) sock * bool -> unit
이들은 소켓의 SO_OOBINLINE 플래그를 조회하고 설정해요. 설정되면 대역외(out-of-band) 데이터가 소켓의 일반 입력 큐에 놓여야 함을 나타내요. 이 옵션은 sendVec', sendArr', sendVecTo', sendArrTo' 함수 중 하나를 사용해 메시지별로 지정할 수 있다는 점에 유의하세요.
val getSNDBUF : ('af, 'sock_type) sock -> int
val setSNDBUF : ('af, 'sock_type) sock * int -> unit
이들은 소켓의 전송 큐 버퍼 크기를 조회하고 설정해요.
val getRCVBUF : ('af, 'sock_type) sock -> int
val setRCVBUF : ('af, 'sock_type) sock * int -> unit
이들은 소켓의 수신 큐 버퍼 크기를 조회하고 설정해요.
val getTYPE : ('af, 'sock_type) sock -> SOCK.sock_type
이것은 소켓의 소켓 타입을 돌려줘요.
val getERROR : ('af, 'sock_type) sock -> bool
이것은 오류가 발생했는지 여부를 나타내요.
val getPeerName : ('af, 'sock_type) sock -> 'af sock_addr
이것은 소켓이 연결된 소켓 주소를 돌려줘요.
val getSockName : ('af, 'sock_type) sock -> 'af sock_addr
이것은 소켓이 바인딩된 소켓 주소를 돌려줘요.
val getNREAD : ('af, 'sock_type) sock -> int
이것은 소켓에서 읽기 위해 이용 가능한 바이트 수를 돌려줘요.
val getATMARK : ('af, active stream) sock -> bool
이것은 소켓의 읽기 포인터가 현재 대역외 표시에 있는지 여부를 나타내요.
val sameAddr : 'af sock_addr * 'af sock_addr -> bool
이것은 두 소켓 주소가 같은 주소인지 검사해요.
familyOfAddr addr
소켓 주소 addr의 주소 패밀리를 돌려줘요.
bind (sock, sa)
수동 소켓 sock에 주소 sa를 바인딩해요. 이 함수는 주소 sa가 이미 사용 중이거나, sock이 이미 주소에 바인딩되어 있거나, sock이 닫혔을 때 SysErr를 발생시켜요.
listen (sock, n)
소켓 sock과 연관된 대기 중인 질문을 위해 (크기 n의) 큐를 만들어요. 큐의 크기는 기본 시스템에 의해 제한되지만, 한도보다 큰 큐 크기를 요청해도 오류가 발생하지 않아요(일반적인 한도는 128이지만, 오래된 시스템은 한도 5를 사용해요). sock이 닫혔으면 이 함수는 SysErr 예외를 발생시켜요.
accept sock
소켓 sock의 대기 중인 연결 큐에서 첫 번째 연결 요청을 꺼내요. 소켓은 bind로 주소에 바인딩되고 listen으로 청취 가능하게 설정되어야 해요. 연결이 있으면 accept는 sock과 같은 속성의 새 활성 소켓 s와 연결 주체의 주소 sa로 구성된 쌍 (s,sa)을 돌려줘요. 큐에 대기 중인 연결이 없으면 accept는 연결이 요청될 때까지 차단해요. select 함수로 소켓을 읽기용으로 검사해 대기 중인 연결 요청을 검사할 수 있어요. sock이 제대로 바인딩되고 활성화되지 않았거나 sock이 닫혔으면 이 함수는 SysErr 예외를 발생시켜요.
**val acceptNB : ('af, passive stream) sock
-> (('af, active stream) sock \
- 'af sock_addr) option**
이 함수는 accept 연산의 비차단 형태예요. 연산이 차단 없이 완료될 수 있으면(즉 대기 중인 연결이 있으면) 이 함수는 SOME(s,sa)을 돌려줘요. 여기서 s는 sock과 같은 속성의 새 활성 소켓이고 sa는 연결 주체의 주소예요. 대기 중인 연결이 없으면 이 함수는 NONE을 돌려줘요. sock이 제대로 바인딩되고 활성화되지 않았거나 sock이 닫혔으면 이 함수는 SysErr 예외를 발생시켜요.
connect (sock, sa)
소켓 sock을 주소 sa에 연결하려고 시도해요. sock이 데이터그램 소켓이면 주소는 소켓이 연관될 피어를 지정해요. sa는 데이터그램이 전송될 주소이자 데이터그램이 수신될 유일한 주소예요. sock이 스트림 소켓이면 주소는 연결할 다른 소켓을 지정해요. 이 함수는 sa가 지정한 주소에 도달할 수 없거나, 연결이 거부되거나 타임아웃되거나, sock이 이미 연결되었거나, sock이 닫혔을 때 SysErr 예외를 발생시켜요.
val connectNB : ('af, 'sock_type) sock * 'af sock_addr
-> bool
이 함수는 connect의 비차단 형태예요. 호출자를 차단하지 않고 연결이 설정될 수 있으면(데이터그램 소켓에서는 보통 참이지만 스트림 소켓에서는 아님) true를 돌려줘요. 그렇지 않으면 false를 돌려주고 연결 시도가 시작돼요. select 함수로 소켓을 쓰기용으로 검사해 연결 완료를 검사할 수 있어요. 이전 연결 시도가 아직 완료되지 않은 소켓에서 호출되면 이 함수는 SysErr를 발생시켜요.
close sock
socket sock에 대한 연결을 닫아요. 소켓이 이미 닫혔으면 이 함수는 SysErr 예외를 발생시켜요.
shutdown (sock, mode)
socket sock에서 전이중(full-duplex) 연결의 전부 또는 일부를 종료해요. mode가 NO_RECVS이면 이후 수신이 금지돼요. mode가 NO_SENDS이면 이후 전송이 금지돼요. mode가 NO_RECVS_OR_SENDS이면 이후 전송과 수신 모두 금지돼요. 소켓이 연결되어 있지 않거나 닫혔으면 이 함수는 SysErr 예외를 발생시켜요.
type sock_desc
이 타입은 소켓의 추상 이름으로, 소켓 모음에 대한 폴링을 지원하는 데 쓰여요.
sockDesc sock
소켓 sock에 이름을 붙이는 소켓 디스크립터를 돌려줘요.
sameDesc (sd1, sd2)
두 소켓 디스크립터 sd1과 sd2가 같은 기본 소켓을 설명하면 true를 돌려줘요. 따라서 어떤 소켓 sock에 대해서도 같은Desc(sockDesc sock, sockDesc sock) 표현은 항상 true를 돌려줘요.
select {rds, wrs, exs, timeout}
rds, wrs, exs의 소켓을 검사해 각각 읽기 준비, 쓰기 준비, 예외 조건 대기 상태인지 확인해요. 호출 프로그램은 명명된 소켓 중 하나 이상이 ``준비''되거나 지정된 타임아웃이 만료될 때까지 차단돼요(NONE 타임아웃은 절대 만료되지 않음). select의 결과는 해당 인자 목록의 준비된 소켓을 담고 있는 세 개의 소켓 디스크립터 목록 레코드예요. 소켓 디스크립터가 인자 목록에 나타나는 순서는 결과 목록에서 유지돼요. 타임아웃은 세 개의 빈 목록 결과로 표시돼요. 인자 소켓 중 하나라도 닫혔거나 타임아웃 값이 음수이면 이 함수는 SysErr를 발생시켜요. select로 소켓이 읽기 준비인지 확인해 accept 호출이 차단될지 검사할 수 있다는 점에 유의하세요. 마찬가지로 소켓이 쓰기 준비인지 확인해 connect 호출이 차단될지 검사할 수 있어요.
ioDesc sock
소켓 sock에 해당하는 I/O 디스크립터를 돌려줘요. 이 디스크립터는 OS.IO 구조의 pollDesc와 poll로 소켓을 폴링하는 데 쓸 수 있어요. OS.IO의 폴링 메커니즘을 사용하면 서로 다른 종류의 I/O 객체를 섞을 수 있다는 장점이 있지만, 모든 시스템이 이런 방식으로 소켓 폴링을 지원하지는 않아요. 응용 프로그램이 소켓만 폴링한다면 위에 정의된 select 함수를 사용하는 것이 더 이식성이 좋아요.
type out_flags = {don't_route : bool, oob : bool}
소켓 출력 연산의 일반 형태에 쓰이는 플래그예요.
type in_flags = {peek : bool, oob : bool}
소켓 입력 연산의 일반 형태에 쓰이는 플래그예요.
sendVec (sock, slice)
sendArr (sock, slice)
이 함수들은 활성 스트림 소켓 sock에서 슬라이스 slice의 바이트를 보내요. 실제로 보낸 바이트 수를 돌려줘요. sock이 닫혔으면 SysErr를 발생시켜요.
sendVec' (sock, slice, {don't_route, oob})
sendArr' (sock, slice, {don't_route, oob})
이 함수들은 활성 스트림 소켓 sock에서 슬라이스 slice의 바이트를 보내요. 실제로 보낸 바이트 수를 돌려줘요. don't_route 플래그가 true이면 데이터가 프로토콜의 일반 라우팅 메커니즘을 우회해 보내져요. oob가 true이면 데이터가 대역외로, 즉 버퍼되었을 수 있는 다른 데이터보다 먼저 보내져요. sock이 닫혔으면 SysErr를 발생시켜요.
**val sendVecNB : ('af, active stream) sock \
- Word8VectorSlice.slice -> int option
val sendVecNB' : ('af, active stream) sock \ - Word8VectorSlice.slice \
- out_flags -> int option
val sendArrNB : ('af, active stream) sock \ - Word8ArraySlice.slice -> int option
val sendArrNB' : ('af, active stream) sock \ - Word8ArraySlice.slice \
- out_flags -> int option**
이 함수들은 sendVec, sendVec', sendArr, sendArr'의 비차단 버전이에요. 차단 없이 완료될 수 있을 때 결과가 SOME에 싸이는 것을 제외하면 차단 형태와 같은 의미를 가지며, 데이터를 보내기 위해 기다려야 한다면 NONE을 돌려줘요.
recvVec (sock, n)
recvVec'(sock, n, {peek,oob})
이 함수들은 활성 스트림 소켓 sock에서 최대 n바이트를 수신해요. 결과 벡터의 크기는 성공적으로 수신된 바이트 수이며 n보다 작을 수 있어요. 다른 쪽 끝에서 연결이 닫혔으면(또는 n이 0이면) 빈 벡터가 반환돼요. 두 번째 버전에서 peek가 true이면 데이터가 수신되지만 연결에서 버려지지 않아요. oob가 true이면 데이터가 대역외로, 즉 버퍼되었을 수 있는 다른 들어오는 데이터보다 먼저 수신돼요. 소켓 sock이 닫혔으면 SysErr를, n < 0 또는 n > Word8Vector.maxLen이면 Size를 발생시켜요.
recvArr (sock, slice)
recvArr' (sock, slice, {peek, oob})
이 함수들은 소켓 sock에서 배열 슬라이스 slice로 데이터를 읽어요. 실제로 수신된 바이트 수를 돌려줘요. 다른 쪽 끝에서 연결이 닫혔거나 슬라이스가 비어 있으면 0이 반환돼요. recvArr'의 경우 peek가 true이면 데이터가 수신되지만 연결에서 버려지지 않아요. oob가 true이면 데이터가 대역외로, 즉 버퍼되었을 수 있는 다른 들어오는 데이터보다 먼저 수신돼요. sock이 닫혔으면 SysErr를 발생시켜요.
**val recvVecNB : ('af, active stream) sock * int
-> Word8Vector.vector option
val recvVecNB' : ('af, active stream) sock * int * in_flags
-> Word8Vector.vector option
val recvArrNB : ('af, active stream) sock \
- Word8ArraySlice.slice -> int option
val recvArrNB' : ('af, active stream) sock \ - Word8ArraySlice.slice \
- in_flags -> int option**
이 함수들은 recvVec, recvVec', recvArr, recvArr'의 비차단 버전이에요. 차단 없이 완료될 수 있을 때 결과가 SOME에 싸이는 것을 제외하면 차단 형태와 같은 의미를 가지며, 입력을 기다려야 한다면 NONE을 돌려줘요.
sendVecTo (sock, sa, slice)
sendArrTo (sock, sa, slice)
이 함수들은 데이터그램 소켓 sock에서 슬라이스 slice가 지정한 메시지를 주소 sa로 보내요. sock이 닫혔거나 소켓이 sa와 다른 주소에 연결되었으면 SysErr를 발생시켜요.
sendVecTo' (sock, sa, slice, {don't_route, oob})
sendArrTo' (sock, sa, slice, {don't_route, oob})
이 함수들은 데이터그램 소켓 sock에서 슬라이스 slice가 지정한 메시지를 주소로 보내요. don't_route 플래그가 true이면 데이터가 프로토콜의 일반 라우팅 메커니즘을 우회해 보내져요. oob가 true이면 데이터가 대역외로, 즉 버퍼되었을 수 있는 다른 데이터보다 먼저 보내져요. sock이 닫혔거나 소켓이 sa와 다른 주소에 연결되었으면 SysErr를 발생시켜요.
**val sendVecToNB : ('af, dgram) sock \
- 'af sock_addr \
- Word8VectorSlice.slice -> bool
val sendVecToNB' : ('af, dgram) sock \ - 'af sock_addr \
- Word8VectorSlice.slice \
- out_flags -> bool
val sendArrToNB : ('af, dgram) sock \ - 'af sock_addr \
- Word8ArraySlice.slice -> bool
val sendArrToNB' : ('af, dgram) sock \ - 'af sock_addr \
- Word8ArraySlice.slice \
- out_flags -> bool**
이 함수들은 sendVecTo, sendVecTo', sendArrTo, sendArrTo'의 비차단 버전이에요. 차단 없이 완료될 수 있으면 연산이 수행되고 true가 돌려지는 것을 제외하면 차단 형태와 같은 의미를 가져요. 그렇지 않으면 false가 돌려지고 메시지는 보내지지 않아요.
recvVecFrom (sock, n)
recvVecFrom' (sock, n, {peek, oob})
이 함수들은 데이터그램 소켓 sock에서 최대 n바이트를 수신하고, 받은 메시지인 벡터 vec와 데이터가 시작된 소켓 주소 sa로 구성된 쌍 (vec,sa)을 돌려줘요. 메시지가 n보다 크면 데이터가 손실될 수 있어요. 두 번째 형태에서 peek가 true이면 데이터가 수신되지만 연결에서 버려지지 않아요. oob가 true이면 데이터가 대역외로, 즉 버퍼되었을 수 있는 다른 들어오는 데이터보다 먼저 수신돼요. sock이 닫혔으면 SysErr를, n < 0 또는 n > Word8Vector.maxLen이면 Size를 발생시켜요.
recvArrFrom (sock, slice)
recvArrFrom' (sock, slice)
이 함수들은 데이터그램 소켓 sock에서 배열 슬라이스 slice로 메시지를 읽어요. 메시지가 슬라이스 크기보다 크면 데이터가 손실될 수 있어요. 실제로 수신된 바이트 수를 돌려줘요. 다른 쪽 끝에서 연결이 닫혔거나 슬라이스가 비어 있으면 0이 반환돼요. recvArrFrom'의 경우 peek가 true이면 데이터가 수신되지만 연결에서 버려지지 않아요. oob가 true이면 데이터가 대역외로, 즉 버퍼되었을 수 있는 다른 들어오는 데이터보다 먼저 수신돼요. sock이 닫혔으면 SysErr를 발생시켜요.
**val recvVecFromNB : ('af, dgram) sock * int
-> (Word8Vector.vector \
- 'sock_type sock_addr) option
val recvVecFromNB' : ('af, dgram) sock * int * in_flags
-> (Word8Vector.vector \ - 'sock_type sock_addr) option
val recvArrFromNB : ('af, dgram) sock \ - Word8ArraySlice.slice
-> (int * 'af sock_addr) option
val recvArrFromNB' : ('af, dgram) sock \ - Word8ArraySlice.slice \
- in_flags
-> (int * 'af sock_addr) option**
이 함수들은 recvVecFrom, recvVecFrom', recvArrFrom, recvArrFrom'의 비차단 버전이에요. 차단 없이 완료될 수 있을 때 결과가 SOME에 싸이는 것을 제외하면 차단 형태와 같은 의미를 가지며, 입력을 기다려야 한다면 NONE을 돌려줘요.## 더 알아보기 (Learn more)