Z/OS에서 C++의 C 소켓 API를 사용하는 방법
Z/OS의 C++에서 C 소켓 API를 정상적으로 동작시키는 데 문제가 있습니다.
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는 어떤 sys/sockets.h에서도 .#ifdef
★★★★★★★★★★★★★★★★★★.
단, 다음과 같은 내용이 포함되어 있습니다.
#ifdef __cplusplus
extern "C" {
#endif
기본적으로 파일 전체를 캡슐화하는 것은 무엇입니까?그게 중요한지 모르겠어.
IBM 설명서 사본을 쉽게 보관할 수 있습니다.
IBM 출판물은 일반적으로 매우 좋지만, 그 형식에 익숙해질 뿐만 아니라 어디서 답을 찾아야 하는지 알아야 합니다.사용하고 싶은 기능이 「기능 테스트 매크로」에 의해서 보호되고 있는 것은 자주 볼 수 있습니다.
친숙한 시스템 프로그래머에게 XL C/C++ 런타임 라이브러리 레퍼런스: Man Pages를 시스템에 설치하도록 요청해야 합니다.그런 다음 "man connect"와 같은 작업을 수행하여 socket connect() API의 man 페이지를 풀업할 수 있습니다.이렇게 하면 다음과 같이 표시됩니다.
포맷
X/Open
#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);
C++, GNU/Linux에서 BSD 소켓 API를 사용하는 데 문제가 없었습니다.사용한 샘플 프로그램은 다음과 같습니다.
#include <sys/socket.h>
int
main()
{
return AF_INET;
}
그래서 저는 z/OS가 복잡한 요소라고 생각합니다만, 저는 z/OS를 사용해 본 적이 없고, 프로그램도 되어 있지 않기 때문에, 확실히 말할 수 없습니다. :-P
z/OS XL C/C++ 프로그래밍 가이드의 z/OS UNIX 시스템 서비스 소켓 사용 섹션을 참조하십시오.필요한 헤더 파일이 포함되어 있고 적절한 #defines를 사용하고 있는지 확인합니다.
이 문서에 대한 링크는 몇 년에 걸쳐 변경되었지만 ibm.com에서 지원 및 다운로드 섹션의 현재 위치를 찾아 제목별로 문서를 검색하면 쉽게 액세스할 수 있습니다.
@Jax: 더extern "C"
매우 중요합니다.헤더 파일에 헤더 파일이 없는 경우 (C++ 전용 헤더 파일이 아닌 경우)를 동봉할 필요가 있습니다.#include
다음과 같이 합니다.
extern "C" {
#include <sys/socket.h>
// include other similarly non-compliant header files
}
기본적으로 C++ 프로그램이 C 기반 설비에 링크하고 싶을 때는 언제든지extern "C"
매우 중요합니다.실제로 외부 참조에 사용되는 이름은 일반 C++ 이름처럼 엉켜지지 않습니다.레퍼런스
그러니까 한번 해봐
#define _OE_SOCKETS
sys/sys.h를 포함하기 전에
_OE_SOCKETS는 단순히 소켓 관련 기호의 정의를 활성화/비활성화하기 위한 것으로 보입니다.일부 라이브러리에서는 불필요한 부품을 컴파일/링크하지 않도록 하기 위해 매크로를 여러 개 사용하는 것이 드문 일이 아닙니다.이 매크로는 다른 소켓 구현에서는 표준이 아니며 z/OS에만 해당되는 것으로 보입니다.
이 페이지를 봐 주세요.
z/VM 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;
}
다음 c89 플래그를 사용합니다.
-D_OE_SOCKETS
예제:
bash-2.03$ c89 -D_OE_SOCKETS [filename].c
자세한 내용은 z/OS XLC/C++ 사용 설명서에서 c89 옵션을 참조하십시오.
소켓 시스템 호출용 C++ 래퍼인 cpp-sockets를 살펴보는 것이 좋습니다.많은 운영체제(Win32, POSIX, Linux, *BSD)에서 동작합니다.z/OS에서는 동작하지 않는다고 생각합니다만, 사용하는 include 파일을 봐 주세요.다른 OS에서도 동작하는 테스트된 코드의 예는 많이 있습니다.
언급URL : https://stackoverflow.com/questions/25/how-to-use-the-c-socket-api-in-c-on-z-os
'programing' 카테고리의 다른 글
JAX-RS - JSON 및 HTTP 상태 코드를 함께 반환하려면 어떻게 해야 합니까? (0) | 2022.08.14 |
---|---|
Java 코드에서 UML 다이어그램(특히 시퀀스 다이어그램)을 생성하려면 어떻게 해야 합니까? (0) | 2022.08.14 |
모바일의 MS 팀 내 인증 탭 (0) | 2022.08.14 |
Vue 컴포넌트 Vue-Instant (0) | 2022.08.14 |
비트 연산자와 "엔디안니스" (0) | 2022.08.14 |