/* Ċ Ġ* ĠCopyright Ġ 2 0 1 4 - 2 0 1 9 ĠJetBrains Ġs . r . o Ġand Ġcontributors . ĠUse Ġof Ġthis Ġsource Ġcode Ġis Ġgoverned Ġby Ġthe ĠApache Ġ 2 . 0 Ġlicense . Ċ Ġ*/ Ċ Ċ package Ġio . ktor . network . sockets Ċ Ċ import Ġio . ktor . network . selector .* Ċ import Ġjava . net .* Ċ import Ġjava . nio . channels .* Ċ Ċ /** Ċ Ġ* ĠRepresent Ġa Ġconfigurable Ġsocket Ċ Ġ*/ Ċ interface ĠConfigur able < out ĠT Ġ: ĠConfigur able < T , ĠO >, ĠO Ġ: ĠSocket Options > Ġ{ ĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠCurrent Ġsocket Ġoptions ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġvar Ġoptions : ĠO ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠConfigure Ġsocket Ġoptions Ġin Ġ[ block ] Ġfunction ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġfun Ġconfigure ( block : ĠO . () Ġ-> ĠUnit ): ĠT Ġ{ ĊĠĠĠĠĠĠĠ Ġ@ Suppress (" UN CHECK ED _ CAST ") ĊĠĠĠĠĠĠĠ Ġval Ġnew Options Ġ= Ġoptions . copy () Ġas ĠO ĊĊĠĠĠĠĠĠĠ Ġblock ( new Options ) ĊĠĠĠĠĠĠĠ Ġoptions Ġ= Ġnew Options ĊĊĠĠĠĠĠĠĠ Ġ@ Suppress (" UN CHECK ED _ CAST ") ĊĠĠĠĠĠĠĠ Ġreturn Ġthis Ġas ĠT ĊĠĠĠ Ġ} Ċ } Ċ Ċ /** Ċ Ġ* ĠSet ĠTCP _ NODE LAY Ġsocket Ġoption Ġto Ġdisable Ġthe ĠN agle Ġalgorithm . Ċ Ġ*/ Ċ fun Ġ< T Ġ: ĠConfigur able < T , Ġ* >> ĠT . tcp No Delay (): ĠT Ġ{ ĊĠĠĠ Ġreturn Ġconfigure Ġ{ ĊĠĠĠĠĠĠĠ Ġif Ġ( this Ġis ĠSocket Options . TCP Client Socket Options ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġno Delay Ġ= Ġtrue ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} Ċ } Ċ Ċ /** Ċ Ġ* ĠStart Ġbuilding Ġa Ġsocket Ċ Ġ*/ Ċ fun Ġa Socket ( selector : ĠSelector Manager ): ĠSocket Builder Ġ= ĠSocket Builder ( selector , ĠSocket Options . create ()) Ċ Ċ /** Ċ Ġ* ĠSocket Ġbuilder Ċ Ġ*/ Ċ @ Suppress (" Public Api Implicit Type ", Ġ" unused ") Ċ class ĠSocket Builder Ġinternal Ġconstructor ( private Ġval Ġselector : ĠSelector Manager , Ġoverride Ġvar Ġoptions : ĠSocket Options ) Ġ: ĊĠĠĠ ĠConfigur able < Socket Builder , ĠSocket Options > Ġ{ ĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠBuild ĠTCP Ġsocket ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġfun Ġtcp () Ġ= ĠTcp Socket Builder ( selector , Ġoptions . peer ()) ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠBuild ĠUDP Ġsocket ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġfun Ġudp () Ġ= ĠU D PS ocket Builder ( selector , Ġoptions . peer (). udp ()) Ċ } Ċ Ċ /** Ċ Ġ* ĠTCP Ġsocket Ġbuilder Ċ Ġ*/ Ċ @ Suppress (" Public Api Implicit Type ") Ċ class ĠTcp Socket Builder Ġinternal Ġconstructor ( ĊĠĠĠ Ġprivate Ġval Ġselector : ĠSelector Manager , ĊĠĠĠ Ġoverride Ġvar Ġoptions : ĠSocket Options Ċ ) Ġ: ĠConfigur able < Tcp Socket Builder , ĠSocket Options > Ġ{ ĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠConnect Ġto Ġ[ hostname ] Ġand Ġ[ port ] ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġsuspend Ġfun Ġconnect ( ĊĠĠĠĠĠĠĠ Ġhostname : ĠString , ĊĠĠĠĠĠĠĠ Ġport : ĠInt , ĊĠĠĠĠĠĠĠ Ġconfigure : ĠSocket Options . TCP Client Socket Options . () Ġ-> ĠUnit Ġ= Ġ{} ĊĠĠĠ Ġ): ĠSocket Ġ= Ġconnect ( Inet SocketAddress ( hostname , Ġport ), Ġconfigure ) ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠBind Ġserver Ġsocket Ġat Ġ[ port ] Ġto Ġlisten Ġto Ġ[ hostname ] ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġfun Ġbind ( ĊĠĠĠĠĠĠĠ Ġhostname : ĠString Ġ= Ġ" 0 . 0 . 0 . 0 ", ĊĠĠĠĠĠĠĠ Ġport : ĠInt Ġ= Ġ 0 , ĊĠĠĠĠĠĠĠ Ġconfigure : ĠSocket Options . Accept or Options . () Ġ-> ĠUnit Ġ= Ġ{} ĊĠĠĠ Ġ): ĠServer Socket Ġ= Ġbind ( Inet SocketAddress ( hostname , Ġport ), Ġconfigure ) ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠConnect Ġto Ġ[ remote Address ] ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġsuspend Ġfun Ġconnect ( ĊĠĠĠĠĠĠĠ Ġremote Address : ĠSocket Address , ĊĠĠĠĠĠĠĠ Ġconfigure : ĠSocket Options . TCP Client Socket Options . () Ġ-> ĠUnit Ġ= Ġ{} ĊĠĠĠ Ġ): ĠSocket Ġ= Ġselector . build Or Close ({ Ġopen SocketChannel () Ġ}) Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġoptions Ġ= Ġoptions . peer (). tcp () ĊĠĠĠĠĠĠĠ Ġconfigure ( options ) ĊĠĠĠĠĠĠĠ Ġassign Options ( options ) ĊĠĠĠĠĠĠĠ Ġnon Blocking () ĊĊĠĠĠĠĠĠĠ ĠSocket Impl ( this , Ġsocket () !! , Ġselector ). apply Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġconnect ( remote Address ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠBind Ġserver Ġsocket Ġto Ġlisten Ġto Ġ[ local Address ] ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġfun Ġbind ( ĊĠĠĠĠĠĠĠ Ġlocal Address : ĠSocket Address ? Ġ= Ġnull , ĊĠĠĠĠĠĠĠ Ġconfigure : ĠSocket Options . Accept or Options . () Ġ-> ĠUnit Ġ= Ġ{} ĊĠĠĠ Ġ): ĠServer Socket Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn Ġselector . build Or Close ({ Ġopen Server SocketChannel () Ġ}) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġoptions Ġ= Ġoptions . accept or () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġconfigure ( options ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġassign Options ( options ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġnon Blocking () ĊĊĠĠĠĠĠĠĠĠĠĠĠ ĠServer Socket Impl ( this , Ġselector ). apply Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġchannel . socket (). bind ( local Address ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} Ċ } Ċ Ċ /** Ċ Ġ* ĠUDP Ġsocket Ġbuilder Ċ Ġ*/ Ċ class ĠU D PS ocket Builder Ġinternal Ġconstructor ( ĊĠĠĠ Ġprivate Ġval Ġselector : ĠSelector Manager , ĊĠĠĠ Ġoverride Ġvar Ġoptions : ĠSocket Options . UD PS ocket Options Ċ ) Ġ: ĠConfigur able < UD PS ocket Builder , ĠSocket Options . UD PS ocket Options > Ġ{ ĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠBind Ġserver Ġsocket Ġto Ġlisten Ġto Ġ[ local Address ] ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġfun Ġbind ( ĊĠĠĠĠĠĠĠ Ġlocal Address : ĠSocket Address ? Ġ= Ġnull , ĊĠĠĠĠĠĠĠ Ġconfigure : ĠSocket Options . UD PS ocket Options . () Ġ-> ĠUnit Ġ= Ġ{} ĊĠĠĠ Ġ): ĠBound Data gram Socket Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn Ġselector . build Or Close ({ Ġopen Data gram Channel () Ġ}) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġoptions Ġ= Ġoptions . udp () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġconfigure ( options ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġassign Options ( options ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġnon Blocking () ĊĊĠĠĠĠĠĠĠĠĠĠĠ ĠData gram Socket Impl ( this , Ġselector ). apply Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġchannel . socket (). bind ( local Address ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠCreate Ġa Ġdata gram Ġsocket Ġto Ġlisten Ġdata grams Ġat Ġ[ local Address ] Ġand Ġset Ġto Ġ[ remote Address ] ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġfun Ġconnect ( ĊĠĠĠĠĠĠĠ Ġremote Address : ĠSocket Address , Ġlocal Address : ĠSocket Address ? Ġ= Ġnull , ĊĠĠĠĠĠĠĠ Ġconfigure : ĠSocket Options . UD PS ocket Options . () Ġ-> ĠUnit Ġ= Ġ{} ĊĠĠĠ Ġ): ĠConnected Data gram Socket Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn Ġselector . build Or Close ({ Ġopen Data gram Channel () Ġ}) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġoptions Ġ= Ġoptions . udp () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġconfigure ( options ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġassign Options ( options ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġnon Blocking () ĊĊĠĠĠĠĠĠĠĠĠĠĠ ĠData gram Socket Impl ( this , Ġselector ). apply Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġchannel . socket (). bind ( local Address ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġchannel . connect ( remote Address ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} Ċ } Ċ Ċ private Ġfun ĠSelect able Channel . non Blocking () Ġ{ ĊĠĠĠ Ġconfigure Blocking ( false ) Ċ } Ċ