如何在C++;在z/OS上 我在C++上对C套接字API在Z/OS上的工作有问题。
虽然我包括了如何在C++;在z/OS上 我在C++上对C套接字API在Z/OS上的工作有问题。,c++,c,sockets,mainframe,zos,C++,C,Sockets,Mainframe,Zos,虽然我包括了sys/socket.h,但仍然会收到编译时错误,告诉我没有定义AF\u INET 我是否遗漏了一些明显的东西,或者这与使用z/OS会使我的问题更加复杂这一事实有关 我发现我正在点击一个#ifdef。显然,z/OS并不满意,除非我定义了我使用的套接字的“类型”: #define _OE_SOCKETS 现在,我个人不知道这个\u OE\u SOCKETS实际上是用来做什么的,所以如果有z/OS SOCKETS程序员(你们三个)在那里,也许你们可以给我一个关于这一切是如何工作的概要
sys/socket.h
,但仍然会收到编译时错误,告诉我没有定义AF\u INET
我是否遗漏了一些明显的东西,或者这与使用z/OS会使我的问题更加复杂这一事实有关
我发现我正在点击一个#ifdef
。显然,z/OS并不满意,除非我定义了我使用的套接字的“类型”:
#define _OE_SOCKETS
现在,我个人不知道这个\u OE\u SOCKETS
实际上是用来做什么的,所以如果有z/OS SOCKETS程序员(你们三个)在那里,也许你们可以给我一个关于这一切是如何工作的概要
测试应用程序
#include <sys/socket.h>
int main()
{
return AF_INET;
}
对sys/sockets.h的检查确实包含了我需要的定义,据我所知,它没有被任何#ifdef
语句阻止
然而,我注意到它包含以下内容:
#ifdef __cplusplus
extern "C" {
#endif
哪个基本上封装了整个文件?不确定它是否重要。< P>我在C++中使用了BSD套接字API,在GNU/Linux中没有问题。以下是我使用的示例程序:
#include <sys/socket.h>
int
main()
{
return AF_INET;
}
#包括
int
main()
{
返回AF_INET;
}
因此,我的看法是z/OS可能是这里的复杂因素,但是,因为我以前从未使用过z/OS,更不用说在其中编程了,我不能肯定地说-P@Jax:extern“C”非常重要。如果头文件没有头文件,则(除非它是仅限C++的头文件),您必须将
#include
随附在其中:
extern "C" {
#include <sys/socket.h>
// include other similarly non-compliant header files
}
extern“C”{
#包括
//包括其他类似的不兼容头文件
}
基本上,任何时候C++程序都想连接到基于C的设备上,<>代码>外部“C”<代码>是至关重要的。实际上,这意味着外部引用中使用的名称不会被破坏,就像普通C++名称一样。我不是C++程序员,但我确实懂C。我 从我的一些C代码中修改了这些调用 markdown也把这些奇怪的作为我的下划线 您应该能够在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;
}
然后有打开、关闭和向套接字发送数据包的方法
例如,打开调用可能如下所示:
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;
}
int my_socket_connect()
{
int return_code=0;
如果(此->套接字类型!=客户端套接字){
cout local_sock,(struct sockaddr*)和this->server_addr,sizeof(this->server_addr));
如果(返回_代码<0){
CUT你可能想看看,一个用于套接字系统调用的C++包装器。它可以与许多操作系统(Win32,POSIX,Linux,*BSD)一起工作。我认为它不会与Z/OS一起工作,但是你可以查看它使用的包含文件,你会有很多测试代码在其他OSS上运行得很好。
< P>所以尝试< /P>
#define _OE_SOCKETS
在包含sys/socket.h之前,SOCKETS似乎只是为了启用/禁用与套接字相关的符号的定义。在某些库中,使用一组宏来实现这一点并不少见,以确保不编译/链接不需要的部件。宏在其他套接字实现中不是标准的,它似乎是可以是特定于z/OS的东西
请查看此页面:
请参阅《z/OS XL C/C++编程指南》中的“使用z/OS UNIX系统服务套接字”部分。请确保包含必要的头文件并使用适当的#定义
指向文档的链接多年来一直在更改,但您应该能够通过查找文档的当前位置并按标题搜索文档来轻松访问该文档。随身携带一份IBM手册:
IBM出版物通常都很好,但您需要习惯它们的格式,并且知道在哪里寻找答案。您会发现,您想要使用的功能通常由“功能测试宏”保护
您应该让您友好的系统程序员在您的系统上安装。然后您可以执行类似“man connect”的操作,以调出socket 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\XOPEN\u SOURCE\u EXTENDED 1
#包括
int connect(int socket,const struct sockaddr*address,socklen\u t address\u len);
伯克利插座
#define _OE_SOCKETS
#include <sys/types.h>
#include <sys/socket.h>
int connect(int socket, struct sockaddr *address, int address_len);
定义插座
#包括
#包括
int connect(int套接字,结构sockaddr*地址,int地址);
使用以下c89标志:
-D_OE_SOCKETS
例如:
bash-2.03$ c89 -D_OE_SOCKETS [filename].c
有关更多信息,请参阅《z/OS XLC/C++用户指南》中的c89选项。z/OS与z/VM的共同点与Windows与Linux的共同点一样多,因此我有点困惑您为什么要发布该链接。请注意,_OE_SOCKETS宏出现在两者中,并且似乎具有相同的用途。这并不奇怪,因为IBM可能使用了相同的代码bas这两个产品都支持套接字。我不想说z/VM文档适用于z/OS,这只是我发现的最相似的情况。我认为这只是巧合。z/VM不使用z/OS语言环境产品,该产品提供用于进行套接字调用的相关头文件。这和原始que无关斯蒂昂。