2008-08-01 13 views
124

CソケットAPIをC++で正しく動作させることに問題があります。具体的には、私はsys/socket.hを含んでいますが、私はまだAF_INETが定義されていないと私に言ってコンパイル時のエラーを取得します。明らかに何かが欠落しているか、これがz/OSでこのコーディングを行っているという事実に関連していて、私の問題ははるかに複雑ですか?z/OSのC++でCソケットAPIを使用する方法


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

#define _OE_SOCKETS 

任意のz/OSソケットプログラマが出ている場合、私は個人的にこの_OE_SOCKETSがために、実際に何であるか見当がつかないので、そこに(皆さん3人)、おそらくあなたは私にこのすべての仕組みの概要を教えてもらえますか?


確かにテストアプリを投稿できます。

#include <sys/socket.h> 

int main() 
{ 
    return AF_INET; 
} 

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

CXX -Wc、XPLINK -Wl、XPLINK -o inet_test inet.C

"./inet.C"、行5.16:CCN5274(S) "AF_INET"の名前検索で宣言が見つかりませんでした。

CCN0797(I)ファイル./inet.Cのコンパイルに失敗しました。オブジェクトファイルが作成されていません。

sys/sockets.hのチェックには必要な定義が含まれていますが、わかる限り#ifdef文でブロックされていません。

私は、しかし、それは次のものが含ま気づいている:基本的にはファイル全体をカプセル化し

#ifdef __cplusplus 
    extern "C" { 
#endif 

。それが重要かどうかはわかりません。

答えて

69

便利なIBMのマニュアルのコピーを保管してください:

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

システムにXL C/C++ Run-Time Library Reference: Man Pages をインストールするように頼む必要があります。次に、 "man connect"のようなことをして、socket connect()APIのmanページをプルアップすることができます。私はそれを行うと、これは私が見たものである。

FORMAT

は、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); 
32

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

#include <sys/socket.h> 

int 
main() 
{ 
    return AF_INET; 
} 

だからこれが私の感想は、私は前のz/OSを使用したことがないので、z/OSがはるかに少ないことでプログラム、しかし、おそらくここでは複雑な要因であるということです、私はこれを断言的に言うことはできません。 :-P

15

@Jax:extern "C"事柄は非常に重要です。ヘッダファイルが1つを持っていない場合(これはC++でない限り - 唯一のヘッダファイル)、そして、あなたはそれをあなたの#includeを同封する必要があります:

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

、C++プログラムがリンクしたいいつでもCベースの施設では、extern "C"が不可欠です。実際には、通常のC++の名前のように、外部参照で使用される名前が変更されないことを意味します。 Reference.

11

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

また、これらの奇妙な_を私の下線としています。

あなたはちょうどこのようなもので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; 
} 
+0

これは元の質問とは関係ありません。 –

17

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

23

あなたはSYS/socket.hに

23

_OE_SOCKETSを含める前に、そう

#define _OE_SOCKETS 

を試し単にソケット関連シンボルの定義を有効/無効にするように見えます。いくつかの図書館では、必要でない部分をコンパイル/リンクしていないことを保証するために、それを行うためのマクロがたくさんあることは珍しいことではありません。このマクロは、他のソケット実装では標準ではありませんが、z/OS特有のものです。

は、このページを見てみましょう:
Compiling and Linking a z/VM C Sockets Program

+2

z/OSはz/VMとWindowsがLinuxと同じように多くの機能を持っているので、私はあなたがなぜそのリンクを投稿したのか少し疑問に思います。 – paxdiablo

+0

_OE_SOCKETSマクロは両方に表示され、同じ目的があるようです。これはおそらくIBMが両方の製品でソケットサポートに同じコードベースを使用していたため、驚くべきことではありません。 z/VMのマニュアルがz/OSに当てはまるとは言いませんでしたが、私が見つけたのはまさにこのケースです。 –

+1

私はそれがちょうど偶然だと思う。 z/VMは、ソケット呼び出しに使用される関連するヘッダー・ファイルを提供するz/OS言語環境製品を使用しません。 –

29

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

文書へのリンクは長年変わってきましたが、Support & Downloads sectionの現在の場所を見つけてibm.comに移動し、文書をタイトルで検索するだけで十分に手に入るはずです。

11

答えは以下のC89フラグを使用している:

-D_OE_SOCKETS 

例eは続く。

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

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

関連する問題