我在让C套接字API在 z/OS
上的C中正常工作时遇到问题 .
虽然我包括 sys/socket.h
,但我仍然遇到编译时错误,告诉我 AF_INET
未定义 .
我是否遗漏了一些明显的东西,或者这与 z/OS
使我的问题变得更复杂这一事实有关?
Update :经过进一步调查,我发现我正在打击 #ifdef
. 显然 z/OS
isn 't happy unless I define which 1758924 of sockets I' m使用:
#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
它基本上封装了整个文件 . 不确定是否重要 .
9 回答
保留IBM手册的副本:
z/OS V1R11.0 XL C/C++ Programming Guide
z/OS V1R11.0 XL C/C++ Run-Time Library Reference
IBM出版物通常非常好,但您需要习惯他们的格式,以及知道在哪里寻找答案 . 你经常会发现你想要使用的功能受到“功能测试宏”的保护
您应该让友好的系统程序员在您的系统上安装XL C/C++ Run-Time Library Reference: Man Pages . 然后,您可以执行"man connect"之类的操作来提取socket connect()API的手册页 . 当我这样做时,这就是我所看到的:
格式
在X / Open
伯克利插座
我在GNU / Linux中使用C中的BSD套接字API没有遇到任何麻烦 . 这是我使用的示例程序:
所以我对此的看法是,z / OS可能是这里的复杂因素,但是,因为我以前从未使用过z / OS,更不用说编程了,我不能肯定地说这个 . :-P
请参见“z / OS XL C / C编程指南”中的“使用z / OS UNIX系统服务套接字”部分 . 确保包含必要的头文件并使用适当的#defines .
多年来,该文档的链接已发生变化,但您应该能够通过查找ibm.com的Support & Downloads section的当前位置并按 Headers 搜索文档来轻松实现 .
所以试试吧
在包含sys / socket.h之前
_OE_SOCKETS似乎只是启用/禁用与套接字相关的符号的定义 . 在某些库中,有一堆宏来执行此操作并不罕见,以确保您不编译/链接不需要的部分 . 宏在其他套接字实现中不是标准的,它似乎是z / OS特有的 .
看看这个页面:
Compiling and Linking a z/VM C Sockets Program
您可能需要查看cpp-sockets,它是套接字系统调用的C包装器 . 它适用于许多操作系统(Win32,POSIX,Linux,* BSD) . 我不会有很多经过测试的代码示例,这些代码在其他操作系统上运行良好 .
@Jax:
extern "C"
事情非常重要 . 如果头文件没有't have one, then (unless it'是一个C -only头文件),你必须用它包含你的#include
:基本上,只要C程序想要链接到基于C的设施,
extern "C"
就至关重要 . 实际上,它意味着外部引用中使用的名称不会像普通的C名称那样被破坏 . Reference.免责声明:我不是C程序员,但我知道C非常好 . 我根据我的一些C代码调整了这些调用 .
降价也把这些奇怪的_作为我的下划线 .
您应该能够在C套接字周围编写一个抽象类,如下所示:
然后有方法在套接字下打开,关闭和发送数据包 .
例如,open调用可能如下所示:
答案是使用下面的c89标志:
示例如下;
有关更多信息,请参阅z / OS XLC / C用户指南中的C89选项 .