如何在z / OS上使用C ++中的C socket API

我一直有问题让C sockets API在C ++中正常工作。具体来说,尽管我包含 sys / socket.h ,但仍然有编译时错误告诉我 AF_INET 未定义。我错过了一些明显的东西,或者这可能与我在 z / OS 上执行此编码的事实有关,而且我的问题更复杂?


Update: Upon further investigation, I discovered that there is an #ifdef that I'm hitting. Apparently z/OS isn't happy unless I define which "type" of sockets I'm using with:

#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”,行5.16:CCN5274(S)“AF_INET”的名称查找没有找到声明。

CCN0797(I)文件./inet.C的编译失败。目标文件未创建。

sys / sockets.h的检查确实包含了我需要的定义,并且据我所知,它没有被任何#ifdef语句阻塞。

但是我注意到它包含以下内容:

#ifdef __cplusplus
  extern "C" {
#endif

它基本上封装了整个文件。不知道它是否重要。

0
额外 编辑
意见: 13

9 答案

我在GNU / Linux中使用C ++中的BSD套接字API没有问题。以下是我使用的示例程序:

#include 

int
main()
{
    return AF_INET;
}

所以我认为z / OS可能是这里的复杂因素,但是,因为我以前从未使用过z / OS,更不用说编程了,所以我不能说这是明确的。 :-P

0
额外

@Jax: extern“C”事情非常重要。如果头文件中没有头文件,那么(除非它是一个只包含C ++的头文件),那么你必须用你的 #include 括起来:

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

Basically, anytime where a C++ program wants to link to C-based facilities, the extern "C" is vital. In practical terms, it means that the names used in external references will not be mangled, like normal C++ names would. Reference.

0
额外

请参阅z / OS XL C / C ++编程指南中的使用z / OS UNIX系统服务套接字部分。确保你包含必要的头文件并使用适当的#defines。

The link to the doc has changed over the years, but you should be able to get to it easily enough by finding the current location of the Support & Downloads section on ibm.com and searching the documentation by title.

0
额外

所以试试

#define _OE_SOCKETS

在包含sys / socket.h之前

0
额外

_OE_SOCKETS似乎只是为了启用/禁用与套接字相关的符号的定义。在一些图书馆中有一大堆宏来做这件事并不少见,以确保你不编译/链接不需要的部分。这个宏在其他套接字实现中不是标准的,它似乎是z / OS特有的。

Take a look at this page:
Compiling and Linking a z/VM C Sockets Program

0
额外
z / OS和z / VM一样与Windows一样,所以我有点困惑你为什么发布这个链接。
额外 作者 paxdiablo,
注意_OE_SOCKETS宏同时出现在两个目录中,并且似乎具有相同的目的。这并不奇怪,因为IBM可能在两种产品中都使用相同的代码库来支持套接字。我并不打算说z / VM文档适用于z / OS,它只是我发现的最相似的案例。
额外 作者 Fabio Ceconello,
我认为这只是一个巧合。 z / VM不使用z / OS Language Environment产品,该产品提供用于进行套接字调用的相关头文件。
额外 作者 Anthony Giorgio,

免责声明:我不是C ++程序员,但我知道C真的很好。一世 从我拥有的一些C代码中调用这些调用。

Also markdown put these strange _ as my underscores.

你应该能够用这样的东西来编写一个围绕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
额外
这与原始问题无关。
额外 作者 Anthony Giorgio,

您可能需要查看 cpp-sockets ,一个用于套接字系统调用的C ++封装器。它适用于许多操作系统(Win32,POSIX,Linux,* BSD)。我认为它不适用于z / OS,但您可以查看它使用的包含文件,并且您会有许多经过测试的代码示例,这些示例在其他操作系统上运行良好。

0
额外

方便地保留IBM手册的副本:

IBM出版物通常非常好,但您需要习惯他们的格式,以及知道在哪里寻找答案。你会经常发现你想要使用的功能是由“功能测试宏”来保护的

您应该请求您的友好系统程序员安装 XL C / C ++运行库参考:手册页 在您的系统上。然后,您可以执行诸如“man connect”之类的操作来为套接字connect()API启动手册页。当我这样做时,这就是我所看到的:

格式

在X / Open

#define _XOPEN_SOURCE_EXTENDED 1
#include 

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

伯克利插座

#define _OE_SOCKETS
#include 
#include 

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

答案是使用下面的c89标志:

 -D_OE_SOCKETS

示例如下。

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

有关更多信息,请参见“z / OS XLC / C ++用户指南”中的C89选项。

0
额外