137


6

z / OS上のCでCソケットAPIを使用する方法

私は `z / OS`上のCでCソケットAPIを正しく動作させることに問題があります。

sys / socket.hをインクルードしていますが、AF_INETが定義されていないことを示すコンパイル時エラーが出ます。

明らかな何かが足りないのでしょうか、それとも `z / OS`上にいることが私の問題をずっと複雑にするという事実に関連しているのでしょうか。

'' '' '

更新:さらなる調査の結果、私は私が打っている `#ifdef`があることを発見しました。 私が使っているソケットの "タイプ"を定義しない限り、 `z / OS`は幸せではないようです。

#define _OE_SOCKETS

さて、私は個人的にはこの _OE_SOCKETS`が実際に何のためにあるのかわからないので、もし z / OS`ソケットプログラマーがいるなら(3人全員)、おそらくこれがどのように機能するのかの概要を教えてください。

'' '' '

テストアプリ

#include

int main()
{
    return AF_INET;
}

コンパイル/リンク出力:

cxx -Wc,xplink -Wl,xplink -o inet_test inet.C

"./inet.C", line 5.16: CCN5274 (S) The name lookup for "AF_INET" did not find a declaration.
CCN0797(I) Compilation failed for file ./inet.C. Object file not created.

'' '' '

sys / sockets.hのチェックには必要な定義が含まれていますが、私が知る限りでは、#ifdefステートメントによってブロックされていません。

しかし、私はそれが次のものを含んでいることに気づいた:

#ifdef __cplusplus
  extern "C" {
#endif

これは基本的にファイル全体をカプセル化しています。 それが重要かどうかわからない。

9 Answer


77


IBMマニュアルのコピーを保管してください。

IBMの出版物は一般的に非常に優れていますが、回答を探す場所を知っているだけでなく、その形式に慣れる必要があります。 使用したい機能が「機能テストマクロ」によって保護されていることがよくあります。

http://www-03.ibm.com/servers/eserver/zseries/zos/le/manpgs.html[XL C / Cランタイムライブラリリファレンス:マニュアルページ]をインストールするよう、フレンドリーなシステムプログラマに依頼してください。あなたのシステム それから、socket connect()APIのmanページを開くために "man connect"のようなことができます。 私がそうするとき、これは私が見るものです:

フォーマット

X /オープン

#define _XOPEN_SOURCE_EXTENDED 1 #include

int connect(intソケット、const struct sockaddr * address、socklen_t address_len);

バークレーソケット

#define _OE_SOCKETS #include #include

int connect(intソケット、sockaddr * address、int address_len);


37


C / GNU / LinuxでBSDソケットAPIを使うのに問題はありませんでした。 これが私が使ったサンプルプログラムです:

#含める

int main(){AF_INETを返します。 }

私の考えでは、z / OSはおそらくここでは複雑な要素になります。ただし、z / OSを使用したことがないため、これまでのところあまりプログラムされていないので、絶対的には言えません。 :-P


31


「z / OS XL C / Cプログラミング・ガイド」の 『z / OS UNIXシステム・サービスのソケットの使用』セクションを参照してください。 必要なヘッダファイルをインクルードし、適切な#definesを使用していることを確認してください。

この文書へのリンクは長年にわたって変更されてきましたが、 http://ibm.com/support/entry/portal/documentation[Supportの現在の場所を見つけることで、十分に簡単にアクセスできるはずです。


25


だから試して

#define _OE_SOCKETS

sys / socket.hをインクルードする前に


25


_OE_SOCKETSは単にソケット関連のシンボルの定義を有効/無効にするためのものです。 一部のライブラリでは、不要な部分をコンパイル/リンクしていないことを確認するために、それを行うためのマクロをたくさん用意することは珍しくありません。 マクロは他のソケット実装では標準的ではありません。z/ OSに固有のもののようです。

このページを見てください。 Compiling and Linking az / VM Cソケットプログラム


19


あなたは cpp-sockets、ソケットシステムコールのためのCラッパーに目を向けたいと思うかもしれません。 多くのオペレーティングシステム(Win32、POSIX、Linux、* BSD)で動作します。 私はそれがz / OSでうまくいくとは思わないが、あなたがそれが使用するインクルードファイルを見ることができるそしてあなたは他のOSでうまくいくテストされたコードの多くの例があるでしょう。


18


@Jax:「extern "C"」ということが非常に重要です。 もしヘッダファイルがそれを持っていなければ、(それがCだけのヘッダファイルでない限り)あなたの `#include`をそれで囲まなければならないでしょう:

extern "C" {
#include
// include other similarly non-compliant header files
}

基本的に、CプログラムがCベースの機能にリンクしたいときはいつでも、 `extern" C "`が不可欠です。 実際的には、通常のCの名前のように、外部参照で使用されている名前が破損しないことを意味します。 http://www.parashift.com/c -faq-lite / mixing -c-and-cpp.html [参照]


13


免責事項:私はCプログラマではありませんが、私はCを本当によく知っています。 私は自分が持っているCコードからこれらの呼び出しを採用しました。

また、マークダウンは私のアンダースコアとしてこれらの奇妙な_を置きました。

このようなものを使ってCソケットの周りに抽象化クラスを書くことができるはずです:

クラスmy_sock {private int sock; private int socket_type;プライベートsocklen_t sock_len;プライベートstruct sockaddr_in server_addr; public char * server_ip;公開符号なしshort server_port; ;

それから、ソケットを開いたり閉じたり、パケットを送信するためのメソッドがあります。

たとえば、open呼び出しは次のようになります。

int my_socket_connect(){int return_code = 0;

if(this-> socket_type!= CLIENT_SOCK){cout << "これはクライアント用ソケットではありません!\ n"; -1を返します。 }

return_code = connect(this-> local_sock、(struct sockaddr *)

if(return_code <0){cout << "Connect()が失敗しました。 %s \ n "、strerror(errno); return return_code;}

return_codeを返します。 }


13


答えは以下のc89フラグを使用することです。

-D_OE_SOCKETS

例を次に示します。

bash-2.03 $ c89 -D_OE_SOCKETS [ファイル名] .c

詳しくは、「z / OS XLC / Cユーザーズ・ガイド」でC89オプションを探してください。