H DFTNAME(SOCKSVR) DATEDIT(*YMD/) BNDDIR('QC2LE') F***************************************************************** F* SOCKSVR : TEST SOCKET SERVER F***************************************************************** D TRUE S 4B 0 INZ(0) D FALSE S 4B 0 INZ(-1) D SOCKFD S 10I 0 INZ(0) D NEWFD S 10I 0 INZ(0) D RC S 10I 0 INZ(0) D AF_INET S 4B 0 INZ(2) D SOCK_STREAM S 4B 0 INZ(1) D ON S 10I 0 INZ(1) D ON_PTR S * INZ(%ADDR(ON)) D ADDR S * INZ(%ADDR(IADDR)) D SIZE S 10I 0 INZ(%SIZE(ADDR)) D LENOFON S 10I 0 INZ(%SIZE(ON)) D PORT S 4B 0 INZ(400) D SOL_SOCKET S 4B 0 INZ(-1) D INADDR_ANY S 4B 0 INZ(0) D SO_REUSEADDR S 4B 0 INZ(55) D TCP_LEN S 4B 0 INZ(1492) D BUFF S 48A D CLIENT S 10I 0 INZ(10) D SOCKET_ER S 12A INZ('SOCKET ERR') D SOCKOPT_ER S 12A INZ('SOCKOPT ERR') D BIND_ER S 12A INZ('BIND ERR') D LISTEN_ER S 12A INZ('LISTEN ERR') D ACCEPT_ER S 12A INZ('ACCEPT ERR') D RECV_ER S 12A INZ('RECV ERR') D SEND_ER S 12A INZ('SEND ERR') D IADDR DS QUALIFIED D SIN_FAMILY 5I 0 D SIN_PORT 5U 0 D S_ADDR 10U 0 D ZERO 8A D*( SOCKET のプロトタイプ宣言 ) D SOCKET PR 10I 0 EメホPネナウ('ヘナウチオホ') D ADDR_FAMILY 10I 0 Vアツマオ D TYPE 10I 0 Vアツマオ D PROTOCOL 10I 0 Vアツマオ D*( SETSOCKOPT のプロトタイプ宣言 ) D SETSOCKOPT PR 10I 0 EメホPネナウ('ヘオホヘナウチナニホ') D SOCK_FD 10I 0 Vアツマオ D LEVEL 10I 0 Vアツマオ D OPT_NAME 10I 0 Vアツマオ D OPT_VALUE * Vアツマオ D OPT_LENGTH 10I 0 Vアツマオ D*( BIND のプロトタイプ宣言 ) D BIND PR 10I 0 EメホPネナウ('イケトエ') D SOCK_FD 10I 0 Vアツマオ D SOCK_ADDR * Vアツマオ D ADDR_LENGTH 10I 0 Vアツマオ D*( LISTEN のプロトタイプ宣言 ) D LISTEN PR 10I 0 EメホPネナウ('ツケヘホオト') D SOCK_FD 10I 0 Vアツマオ D BACK_LOG 10I 0 Vアツマオ D*( ACCEPT のプロトタイプ宣言 ) D ACCEPT PR 10I 0 EメホPネナウ('アウウオニホ') D SOCK_FD 10I 0 Vアツマオ D SOCK_ADDR * Vアツマオ D ADDR_LENGTH * Vアツマオ D*( RECV のプロトタイプ宣言 ) D RECV PR 10I 0 EメホPネナウ('ネオウミ') D SOCK_FD 10I 0 Vアツマオ D BUFFER * Vアツマオ D BUFF_LENGTH 10I 0 Vアツマオ D FLAGS 4B 0 Vアツマオ D*( SEND のプロトタイプ宣言 ) D SEND PR 10I 0 EメホPネナウ('ヘオトエ') D SOCK_FD 10I 0 Vアツマオ D BUFFER * Vアツマオ D BUFF_LENGTH 10I 0 Vアツマオ D FLAGS 10I 0 Vアツマオ D*( CLOSE のプロトタイプ宣言 ) D CLOSE PR 10I 0 EメホPネナウ('ウツナヘオ') D SOCK_FD 10I 0 Vアツマオ D*( PERROR のプロトタイプ宣言 ) D PERROR PR EメホPネナウ('ニオネネナネ') D MSG * Vアツマオ C '* SOCKSVR *' DSPLY ANS 1 C*( SOCKET の作成 ) C*--------------------------------------------------------------------+ C EVAL SOCKFD = SOCKET(AF_INET:SOCK_STREAM:0) C*--------------------------------------------------------------------+ C SOCKFD IFLT *ZEROS C CALLP PERROR(%ADDR(SOCKET_ER)) C GOTO END C END C*( SOCKET オプションの設定 ) C 'SOCKET OK' DSPLY C*--------------------------------------------------------------------+ C EVAL RC = SETSOCKOPT(SOCKFD: SOL_SOCKET: C SO_REUSEADDR: %ADDR(ON_PTR): LENOFON) C*--------------------------------------------------------------------+ C RC IFLT *ZEROS C CALLP PERROR(%ADDR(SOCKOPT_ER)) C GOTO END C END C 'SOCKOPT OK' DSPLY C*( PORT=400 にバインドする ) C EVAL IADDR.SIN_FAMILY = AF_INET C EVAL IADDR.SIN_PORT = PORT C EVAL IADDR.S_ADDR = INADDR_ANY C MOVE *ALLX'00' IADDR.ZERO C*--------------------------------------------------------------------+ C EVAL RC = BIND(SOCKFD: %ADDR(IADDR): C %SIZE(IADDR)) C*--------------------------------------------------------------------+ C RC IFLT *ZEROS C CALLP PERROR(%ADDR(BIND_ER)) C GOTO END C END C 'BIND OK' DSPLY C*( LISTEN クライアントからの要求を待機する ) C*--------------------------------------------------------------------+ C EVAL RC = LISTEN(SOCKFD:CLIENT) C*--------------------------------------------------------------------+ C RC IFLT *ZEROS C CALLP PERROR(%ADDR(LISTEN_ER)) C GOTO END C END C 'LISTEN OK' DSPLY C*( ACCEPT クライアントからの要求を受け入れる ) C*--------------------------------------------------------------------+ C EVAL NEWFD = ACCEPT(SOCKFD:ADDR:%ADDR(SIZE)) C*--------------------------------------------------------------------+ C NEWFD IFLT *ZEROS C CALLP PERROR(%ADDR(ACCEPT_ER)) C GOTO END C END C 'ACCEPT OK' DSPLY C*( RECV クライアントからのデータを読む ) C*--------------------------------------------------------------------+ C EVAL RC = RECV(NEWFD: %ADDR(BUFF): C TCP_LEN: 0) C*--------------------------------------------------------------------+ C RC IFLT *ZEROS C CALLP PERROR(%ADDR(RECV_ER)) C GOTO END C END C 'RECV OK' DSPLY C 'BUFF=' CAT(P) BUFF:0 DSP40 40 C DSP40 DSPLY C*( SEND クライアントにのデータを送信する ) C* MOVEL(P) '*SOCK SERVER'BUFF C '*SOCK SERVER'CAT(P) X'00':0 BUFF C*--------------------------------------------------------------------+ C EVAL RC = SEND(NEWFD: %ADDR(BUFF): C %LEN(BUFF): 0) C*--------------------------------------------------------------------+ C RC IFLT *ZEROS C CALLP PERROR(%ADDR(SEND_ER)) C GOTO END C END C 'SEND OK' DSPLY C '************'DSPLY C '* SOCKSVR *'DSPLY C '* E.O.J *'DSPLY C '************'DSPLY C*( CLOSE ソケットを閉じて終了する ) C CALLP CLOSE(NEWFD) C CALLP CLOSE(SOCKFD) C END TAG C ' ' DSPLY ANS 1 C SETON LR C RETURN