公開日: 04/01/2021

ソケットへのメッセージ

Socket( )を使って作成したソケットには、さまざまなメッセージを送ることができます。

connect

リスニングソケットに接続します。接続に成功した場合は{"connect", "ok"}、失敗した場合はエラーが戻されます(たとえば、{"connect", "CONNREFUSED:The attempt to connect was forcefully rejected."})。

close

処理の終了時に接続を閉じます。リストを戻します(たとえば{"Close", "ok"})。

send

ソケットの相手側にSTREAMメッセージを送信します。

sendto

ソケットの相手側にDGRAMメッセージを送信します。

recv

STREAMメッセージを受信します。データとその他の情報がリスト形式で戻されます。Recvには、受信できるバイト数を指定する数値引数が必要です。

recvfrom

DGRAMメッセージを受信します。

ioctl

ソケットのブロック動作をコントロールする。デフォルトでは、ソケットはブロックに設定されています。データが使用できるようになるまで、ソケットはJSLプログラムに制御を戻しません。これによってスクリプトの作成は容易になりますが、接続先がデータの供給に失敗した場合に特に頑健ではありません。非ブロックに設定されているソケットは、即座に"ok"コードとデータを戻すか、または"WOULDBLOCK: ..."コードを戻しますが、ソケットがブロックのときは、データが使用可能になるまで待たなければなりません(次のJSLステートメントへの進行をブロックする)。

重要:この問題を回避するため、JSLコールバックを使用するバックグラウンド処理があります。recvrecvfrom、またはacceptは、ソケットを非ブロックに設定し、Waitステートメントの間やJMPがアイドルのときにポーリングして、バックグラウンドで動作させることができます。

ioctlはリストを戻します。たとえば、{"ioctl", "ok"}、またはソケットがバインド(下のbindを参照)または接続されていない場合は{"ioctl", "NOTCONN:The socket is not connected."}を戻します。

bind

クライアントソケットが待機(リッスン)するアドレスを、サーバーソケットに通知します。bindは、ローカルコンピュータのポートをソケットに関連付けます。ソケットがlistenするためには、この処理が必要です(下を参照)。bindで指定したポートは、接続するソケットに対していつも使用されるとは限りません。オペレーティングシステムが、使用されていないポートを選びます。サーバーにはbindが必要です。サーバーに接続したいユーザは、どのポートが使用されるのかを知っている必要があるためです。通常使用されるポートは、HTTPポートである80です。bindはリストを戻します。たとえば、{"bind", "ok"}、または使用しているコンピュータ上にない名前にバインドしようとしている場合は{"bind", "ADDRNOTAVAIL:The specified address is not available from the local machine."}を戻します。別のソケットは、使用しているコンピュータの名前と番号がわかっていれば、このソケットに接続することができます。

listen

接続をlisten状態にするようサーバーに伝える。リスニングソケットは、他のソケットからの接続をリッスンします。一度、リッスンの状態にすれば、継続して、リッスンの状態になっています。accept(下を参照)は、他のソケットからの接続を受け入れるのに使用します。listenはリストを戻します。たとえば、{"listen", "ok"}、またはバインドコールに失敗した場合は、{"listen", "INVAL:The socket is (または状況によってはis not) already bound to an address.または、Listen was not invoked prior to accept.または、Invalid host address.または、The socket has not been bound with Bind."}を戻します。

accept

サーバーソケットに、接続を受け入れて、新しく接続されたソケットを戻すよう伝える。acceptは、何が起こったかを記したリストを戻します。処理が成功した場合は接続先のソケットに接続される新しいソケットもリストに記されます。たとえば、{"Accept", "ok", "localhost", socket( )}などです。ここで、localhostは接続したコンピュータの名前で、4番目の引数はメッセージをsendまたはrecvするのに使用するソケットです。

getpeername

接続先について問い合わせます。GetPeerNameは、接続先のソケットに関する情報のリストを戻します。たとえば、{"getpeername", "ok", "127.0.0.1", "4087"}といったリストを戻します。サーバーソケットの場合、接続したクライアントのアドレスとポートが判明します。クライアントソケットの場合、接続要求で使用したサーバーの名前とポートを再確認できます。

getsockname

接続元について問い合わせます。GetSockNameは、こちら側のソケットに関する情報のリストを戻します。たとえば、{"getsockname", "ok", "localhost", "httpd"}といったリストを戻します。クライアントソケットの場合、オペレーティングシステムが割り当てたポートが判明します。サーバーソケットの場合、bindによってすでにその情報はわかっています。

より詳細な情報が必要な場合や、質問があるときは、JMPユーザーコミュニティで答えを見つけましょう (community.jmp.com).