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

我在使用 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

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

15718 次浏览

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

#include <sys/socket.h>


int
main()
{
return AF_INET;
}

所以我的看法是 z/OS 可能是这里的复杂因素,然而,因为我从来没有使用过 z/OS,更不用说在它里面编程了,我不能明确地说这一点。翻译: 小宝宝 P- 小宝宝 P- 小宝宝 P- 小宝宝 P- 小宝宝 P- 小宝宝 P- 小宝宝 P- 小宝宝 P- 小宝宝 P- 小宝宝 P- 小宝宝 P- 小宝宝

@ Jax: extern "C"的事很重要,非常非常重要。如果一个头文件没有头文件,那么(除非它是一个只有 C + + 的头文件) ,你就必须用它来封装你的 #include:

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

基本上,只要 C + + 程序想要链接到基于 C 的设施,extern "C"就至关重要。实际上,这意味着在外部引用中使用的名称不会像普通的 C + + 名称那样被损坏。参考文献。

免责声明: 我不是一个 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;
};

然后使用方法打开、关闭和向套接字发送数据包。

例如,公开调用可能是这样的:

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;
}

您可能需要查看一下 Cpp 插座,它是用于套接字系统调用的 C + + 包装器。它适用于许多操作系统(Win32、 POSIX、 Linux、 * BSD)。我不认为它适用于 z/OS,但是您可以看一下它使用的包含文件,您将看到许多在其他操作系统上运行良好的测试代码示例。

那就试试

#define _OE_SOCKETS

在包含 sys/socket.h 之前

_ OE _ SOCKETS 似乎只是启用/禁用套接字相关符号的定义。在某些库中,使用大量宏来完成这项工作并不罕见,以确保不会编译/链接不需要的部分。宏在其他套接字实现中并不是标准的,它似乎是 z/OS 特有的东西。

看看这一页:
编译和链接 z/VM C 套接字程序

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

指向文档的链接在过去几年中已经发生了变化,但是通过在 Ibm.com上找到 支援及下载部分的当前位置并按标题搜索文档,您应该能够很容易地找到它。

随身携带一份 IBM 手册:

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

您应该要求您友好的系统程序员安装 XL C/C + + 运行时库参考资料: Man Pages 在你的系统里。然后,您可以执行“ 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);

Berkeley套接字

#define _OE_SOCKETS
#include <sys/types.h>
#include <sys/socket.h>


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

使用以下 c89标志:

 -D_OE_SOCKETS

例如:

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

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