z / OS의 C ++에서 C 소켓 API를 사용하는 방법


158

내가 제대로 작동하려면 C 소켓 API를 받고 문제에 봉착 C++에를 z/OS.

내가 포함 sys/socket.h하고 있지만 여전히 정의되지 않은 컴파일 시간 오류발생합니다 .AF_INET

내가 명백한 것을 놓치고 z/OS있습니까 , 아니면 켜져있는 것이 문제를 훨씬 더 복잡하게 만드는 사실과 관련이 있습니까?


업데이트 : 추가 조사 결과, 내가 #ifdef치고 있는 것이 발견되었습니다 . z/OS내가 사용하는 소켓의 "유형"을 정의하지 않으면 분명히 행복하지 않습니다.

#define _OE_SOCKETS

이제 개인적으로 이것이 _OE_SOCKETS실제로 무엇인지 알지 못 하므로 z/OS소켓 프로그래머가 3 명 모두 있다면,이 모든 것이 어떻게 작동하는지 나에게 줄 수 있습니까?


테스트 앱

#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

기본적으로 전체 파일을 캡슐화하는 것은 무엇입니까? 중요한지 확실하지 않습니다.

답변:


86

IBM 매뉴얼 사본을 편리하게 유지하십시오.

IBM 서적은 일반적으로 매우 우수하지만, 답변을 찾을 수있는 곳을 알면서 형식에 익숙해 져야합니다. 사용하려는 기능이 "기능 테스트 매크로"에 의해 보호되는 경우가 종종 있습니다.

친숙한 시스템 프로그래머에게 시스템에 XL C / C ++ Run-Time Library Reference : Man Pages 를 설치하도록 요청해야 합니다. 그런 다음 "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 _OE_SOCKETS
#include <sys/types.h>
#include <sys/socket.h>

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

38

GNU / Linux의 C ++에서 BSD 소켓 API를 사용하는 데 아무런 문제가 없었습니다. 내가 사용한 샘플 프로그램은 다음과 같습니다.

#include <sys/socket.h>

int
main()
{
    return AF_INET;
}

따라서 z / OS는 아마도 여기에서 복잡한 요소 일 것입니다. 그러나 이전에는 z / OS를 사용해 본 적이 없으며 프로그래밍이 훨씬 적기 때문에 결정적으로 말할 수는 없습니다. :-피


32

참고 항목 사용 Z / OS UNIX 시스템 서비스 소켓 은 z / OS XL C / C ++ 프로그래밍 안내서의 섹션을 참조하십시오. 필요한 헤더 파일을 포함하고 적절한 #defines를 사용해야합니다.

문서에 대한 링크는 지난 몇 년 동안 변경되었습니다,하지만 당신은의 현재 위치 찾아 쉽게 충분히 얻을 수있을 것입니다 지원 및 다운로드 섹션ibm.com 및 제목의 문서를 검색.


26

_OE_SOCKETS는 단순히 소켓 관련 심볼의 정의를 활성화 / 비활성화하는 것으로 보입니다. 일부 라이브러리에서는 필요하지 않은 부분을 컴파일 / 링크하지 않도록하기 위해 매크로를 많이 갖는 것이 드문 일이 아닙니다. 매크로는 다른 소켓 구현에서 표준이 아니며 z / OS에 특정한 것으로 보입니다.

이 페이지를 살펴보십시오.
z / VM C 소켓 프로그램 컴파일 및 링크


2
z / OS는 Windows가 Linux에서와 마찬가지로 z / VM과 공통점이 많으므로 해당 링크를 게시 한 이유에 약간 관심이 있습니다.
paxdiablo

_OE_SOCKETS 매크로는 둘 다에 나타나며 동일한 목적을 가진 것 같습니다. IBM이 두 제품 모두에서 소켓 지원을 위해 동일한 코드 기반을 사용했기 때문에 놀라운 것은 아닙니다. z / VM 설명서가 z / OS에 적용된다고 말하려고하지 않았습니다. 제가 찾은 가장 유사한 경우입니다.
Fabio Ceconello 2016

1
우연의 일치라고 생각합니다. z / VM은 소켓 호출에 사용되는 관련 헤더 파일을 제공하는 z / OS Language Environment 제품을 사용하지 않습니다.
Anthony Giorgio

25

그래서 시도하십시오

#define _OE_SOCKETS

sys / socket.h를 포함시키기 전에


19

소켓 시스템 호출을위한 C ++ 래퍼 인 cpp-sockets를 살펴볼 수 있습니다 . 많은 운영 체제 (Win32, POSIX, Linux, * BSD)에서 작동합니다. z / OS와 함께 작동한다고 생각하지 않지만 사용하는 포함 파일을 살펴볼 수 있으며 다른 OS에서 잘 작동하는 테스트 코드의 많은 예제가 있습니다.


18

@Jax : extern "C"문제는 매우 중요합니다. 헤더 파일에 C ++ 전용 헤더 파일이 아닌 경우 헤더 파일이 없으면이를 묶어야합니다 #include.

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

기본적으로 C ++ 프로그램이 C 기반 시설에 연결하려고 할 때마다 extern "C"필수적입니다. 실제 용어로, 외부 참조에 사용 된 이름은 일반적인 C ++ 이름과 같이 엉망이되지 않습니다. 참고.


14

면책 조항 : 저는 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;
}

이것은 원래 질문과 관련이 없습니다.
Anthony Giorgio

13

답은 다음에 나오는 c89 플래그를 사용하는 것입니다.

 -D_OE_SOCKETS

예는 다음과 같습니다.

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

자세한 정보는 z / OS XLC / C ++ 사용자 안내서에서 C89 옵션을 찾으십시오.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.