質問

C ソケット API を C++ で適切に動作させるのに問題があります。 z/OS.

含めていますが、 sys/socket.h, 、依然としてコンパイル時エラーが発生し、次のことがわかります AF_INET 定義されていません。

明らかな何かが欠けているのでしょうか、それともこれはオンになっているという事実に関係していますか? z/OS 私の問題はさらに複雑になりますか?


アップデート:さらに調べてみると、あることが分かりました。 #ifdef 私が打っていること。どうやら z/OS 使用しているソケットの「タイプ」を定義しないと満足できません。

#define _OE_SOCKETS

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


テストアプリ

#include <sys/socket.h>

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

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

役に立ちましたか?

解決

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

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

フレンドリーなシステム プログラマーにインストールを依頼してください。 XL C/C++ ランタイム・ライブラリー・リファレンス:マニュアルページ あなたのシステム上で。次に、「man connect」などの操作を実行して、socket connect() API のマニュアル ページを表示できます。それを実行すると、次のようになります。

フォーマット

×/開く

#define _XOPEN_SOURCE_EXTENDED 1
#include <sys/socket.h>

int connect(int socket, const struct sockaddr *address, socklen_t address_len);

バークレーソケット

#define _OE_SOCKETS
#include <sys/types.h>
#include <sys/socket.h>

int connect(int socket, struct sockaddr *address, int address_len);

他のヒント

C++ や GNU/Linux で BSD ソケット API を使用するのに問題はありませんでした。私が使用したサンプルプログラムは次のとおりです。

#include <sys/socket.h>

int
main()
{
    return AF_INET;
}

したがって、これについての私の見解は、おそらく z/OS がここでの複雑な要因であるということです。しかし、私はこれまでに z/OS を使用したことがなく、ましてや z/OS でプログラムしたこともないので、これを断定的に言うことはできません。:-P

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

ドキュメントへのリンクは長年にわたって変更されていますが、現在の場所を見つけることで簡単にアクセスできるはずです。 サポートとダウンロードセクション の上 IBM.com タイトルでドキュメントを検索します。

それで試してみてください

#define _OE_SOCKETS

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

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

このページを見てください。
z/VM C ソケット プログラムのコンパイルとリンク

見てみるのもいいかもしれません cppソケット, 、ソケット システム コールの C++ ラッパー。多くのオペレーティング システム (Win32、POSIX、Linux、*BSD) で動作します。z/OS では動作しないと思いますが、使用するインクルード ファイルを確認すると、他の OS で適切に動作するテスト済みのコードの例が数多く見つかります。

@ジャックス:の extern "C" 事はとても大事だ。ヘッダー ファイルにヘッダーがない場合は (C++ 専用のヘッダー ファイルでない限り)、 #include それと:

extern "C" {
#include <sys/socket.h>
// include other similarly non-compliant header files
}

基本的に、C++ プログラムが C ベースの機能にリンクしたい場合は常に、 extern "C" 重要です。実際には、これは、通常の C++ 名のように、外部参照で使用される名前が破壊されないことを意味します。 参照。

免責事項:私は C++ プログラマーではありませんが、C についてはよく知っています。これらの呼び出しは、私が持っているいくつかのcコードから適応しました。

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

次のようなものを使用して、C ソケットの周囲に抽象化クラスを作成できるはずです。

class my_sock {
    private int sock;
    private int socket_type;
    private socklen_t sock_len;
    private struct sockaddr_in server_addr;
    public char *server_ip;
    public unsigned short server_port;
};

次に、ソケットを開いたり、閉じたり、パケットを送信したりするためのメソッドを用意します。

たとえば、オープン コールは次のようになります。

int my_socket_connect()
{
    int return_code = 0;

    if ( this->socket_type != CLIENT_SOCK ) {
        cout << "This is a not a client socket!\n";
        return -1;
    }

    return_code = connect( this->local_sock, (struct sockaddr *) &this->server_addr, sizeof(this->server_addr));

    if( return_code < 0 ) {
        cout << "Connect() failure! %s\n", strerror(errno);
        return return_code;
    }

    return return_code;
}

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

 -D_OE_SOCKETS

以下に例を示します。

 bash-2.03$ c89 -D_OE_SOCKETS [filename].c

詳細については、「z/OS XLC/C++ ユーザーズ ガイド」の「C89 オプション」を参照してください。

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top