我在让 C 套接字 API 在 z/OS 上的 C++ 中正常工作时遇到问题。
虽然我包括sys/socket.h,但我仍然收到编译时错误,告诉我AF_INET未定义。
sys/socket.h
AF_INET
我是否遗漏了一些明显的东西,或者这是否与在 z/OS 上使我的问题变得更加复杂这一事实有关?
我发现有一个#ifdef我正在击中。显然 z/OS 并不高兴,除非我定义了我正在使用的套接字的“类型”:
#ifdef
#define _OE_SOCKETS
现在,我个人不知道这_OE_SOCKETS实际上是为了什么,所以如果那里有任何 z/OS 套接字程序员(你们三个),也许你可以给我一个关于这一切是如何工作的纲要?
_OE_SOCKETS
测试应用
#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
基本上封装了整个文件?不确定是否重要。
随身携带一份 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);