0

このRPG ソケット チュートリアルから、Java サーバー ソケットを呼び出すソケット クライアントを RPG で作成しました。

問題は、connect()/send() 操作がブロックされることであり、接続/送信が 1 秒単位で実行できない場合は、ログに記録して終了する必要があるという要件があります。

ソケットをノンブロッキング モードに設定した場合 (fnctl を使用していると思います)、処理方法を完全には理解できず、例を示した有用なドキュメントが見つかりません。

ノンブロッキング ソケットに接続する場合は、select(..., timeout) を実行する必要があると思います。これにより、接続が成功し、(bytes) を送信できるかどうかがわかります。しかし、後で send(bytes) すると、現在はノンブロッキング ソケット (呼び出し後すぐに返されます) になっているため、send() が実際にサーバーにバイトを送信したことを確認するにはどうすればよいですか?ソケット?

AS400 でクライアント ソケットを Java または C プロシージャとして使用するようにフォールバックすることもできますが、単純な RPG プログラムでそれを保持したいだけです。

誰かがそれを行う方法を理解するのを手伝ってくれませんか? ありがとう !

4

1 に答える 1

2

私の意見では、あなたが言及した RPG チュートリアルにはわずかな欠陥があります。あなたの混乱を引き起こしていると私が信じているのは、次のセクションのコードです。

...
したがって、通常、次のように send() API を呼び出します。

D miscdata        S             25A
D rc              S             10I 0

C                   eval      miscdata = 'The data to send goes here'
C                   eval      rc = send(s: %addr(miscdata): 25: 0)
c                   if        rc < 25
C*  for some reason we weren't able to send all 25 bytes!
C                   endif

...

のドキュメントを読むsend()と、戻り値が -1 より大きい場合はエラーを示さないことがわかりますが、上記のコードではエラーが発生したように見えます。実際、送信された内容を反映するためにポインターをバッファーに移動し続けると仮定すると、戻り値の合計はバッファーのサイズと等しくなければなりません。BeejのGuide to Network Programming を参照してください。また、Richard Stevens の著書『UNIX Network Programming, Volume 1』で詳細な説明を参照することもできます。

前の最後の送信close()が実際の送信を行ったかどうかを判断する問題については、上記の段落で、データのどの部分が送信されたかを判断する方法を説明しています。ただし、 が設定されていない限り、呼び出しclose()はすべての未送信データの送信を試みますSO_LINGER

fnctl()はブロッキングの制御にsetsockopt()使用され、 は設定に使用されSO_LINGERます。

使用されているネットワーク通信の抽象化は、BSD ソケットです。OS 間での実装には若干の違いがありますが、一般的には非常に均一です。これは、他の OS 用に書かれたドキュメントを一般的に使用して、広範な概要を把握できることを意味します。ほとんどの場合

于 2010-08-28T22:50:33.677 に答える