小编典典

如何在 z/OS 上的 C++ 中使用 C 套接字 API

all

我在让 C 套接字 API 在 z/OS 上的 C++ 中正常工作时遇到问题。

虽然我包括sys/socket.h,但我仍然收到编译时错误,告诉我AF_INET未定义。

我是否遗漏了一些明显的东西,或者这是否与在 z/OS 上使我的问题变得更加复杂这一事实有关?

我发现有一个#ifdef我正在击中。显然 z/OS 并不高兴,除非我定义了我正在使用的套接字的“类型”:

#define _OE_SOCKETS

现在,我个人不知道这_OE_SOCKETS实际上是为了什么,所以如果那里有任何 z/OS
套接字程序员(你们三个),也许你可以给我一个关于这一切是如何工作的纲要?

测试应用

#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

基本上封装了整个文件?不确定是否重要。


阅读 74

收藏
2022-08-24

共1个答案

小编典典

随身携带一份 IBM 手册:

IBM 的出版物通常都很好,但您需要习惯它们的格式,并知道在哪里可以找到答案。您会经常发现您要使用的功能受到“功能测试宏”的保护

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

格式

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);
2022-08-24