173

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

を含めていますが、まだ定義されていない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

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

4

9 に答える 9

95

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

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

XL C/C++ ランタイム・ライブラリー・リファレンス: マニュアル・ページ をシステムにインストールするよう、親切なシステム・プログラマーに依頼してください。次に、「man connect」などを実行して、ソケット connect() API の man ページを表示できます。私がそれをすると、これが私が見るものです:

フォーマット

X/開く

#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);
于 2009-09-18T11:17:01.933 に答える
44

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

#include <sys/socket.h>

int
main()
{
    return AF_INET;
}

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

于 2008-08-01T12:22:40.797 に答える
38

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

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

于 2009-05-15T05:27:09.057 に答える
31

だから試してみてください

#define _OE_SOCKETS

sys/socket.h を含める前に

于 2008-09-21T12:37:01.023 に答える
31

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

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

于 2008-10-11T00:38:49.903 に答える
24

sockets システム コールの C++ ラッパーであるcpp-socketsを参照してください。多くのオペレーティング システム (Win32、POSIX、Linux、*BSD) で動作します。z/OS では動作しないと思いますが、それが使用するインクルード ファイルを調べると、他の OS で適切に動作するテスト済みコードの例が多数あるはずです。

于 2008-09-07T08:21:50.157 に答える
24

@ジャックス:それextern "C"は非常に重要です。ヘッダー ファイルにヘッダー ファイルがない場合は (C++ のみのヘッダー ファイルでない限り)、次のように自分を囲む必要があります#include

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

基本的に、C++ プログラムが C ベースの機能にリンクしたいときはいつでも、extern "C"が不可欠です。実際には、通常の C++ 名のように、外部参照で使用される名前がマングルされないことを意味します。参照。

于 2008-08-01T13:40:16.443 に答える
19

免責事項: 私は 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;
};

次に、ソケットを開き、閉じ、パケットを送信するメソッドを用意します。

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

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;
}
于 2008-08-29T18:56:19.723 に答える
18

次の c89 フラグを使用します。

 -D_OE_SOCKETS

例:

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

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

于 2011-04-11T18:59:23.960 に答える