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


157

私はで正しく動作させるには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

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

回答:


86

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

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

使いやすいシステムプログラマーに、システムにXL C / C ++ランタイムライブラリリファレンス:マニュアルページ をインストールするよう依頼する必要があります。次に、「man connect」などの操作を行って、ソケットのconnect()APIのマニュアルページをプルアップします。私がそれをするとき、これは私が見るものです:

フォーマット

X / Open

#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);

38

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

#include <sys/socket.h>

int
main()
{
    return AF_INET;
}

したがって、これについての私の見方は、z / OSがおそらくここでの複雑な要素であるということです。ただし、これまでz / OSを使用したことがないため、プログラミングがはるかに少ないため、これを断定することはできません。:-P


32

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

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


26

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

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


2
z / OSは、WindowsがLinuxと同じくらい多くの共通点をz / VMと共有しているので、そのリンクを投稿した理由は少し戸惑いました。
paxdiablo 2009

_OE_SOCKETSマクロが両方に表示され、同じ目的を持っているように見えることに注意してください。おそらくIBMが両方の製品のソケットサポートに同じコードベースを使用したため、これは驚くに値しません。z / VMのドキュメントがz / OSに適用されるとは言いませんでした。これは、私が見つけた最も類似したケースです。
Fabio Ceconello、

1
偶然だと思います。z / VMは、ソケット呼び出しを行うために使用される関連ヘッダーファイルを提供するz / OS言語環境製品を使用しません。
アンソニージョルジオ

25

だから試して

#define _OE_SOCKETS

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


19

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


18

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

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

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


14

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

これは元の質問とは関係ありません。
アンソニージョルジオ

13

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

 -D_OE_SOCKETS

次に例を示します。

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

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

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.