programing

크로스 플랫폼 소켓

shortcode 2022. 8. 23. 21:39
반응형

크로스 플랫폼 소켓

Windows는 UNIX 소켓을 사용하지 않는 반면 Mac OS는 UNIX 소켓을 사용하지 않습니다.지금까지 제 소프트웨어는 코드 변경 없이 크로스 플랫폼이었습니다.하지만 지금은 네트워크 통신을 하고 싶습니다.POSIX 소켓에 대해서는 알고 있지만 Windows 소켓에 대해서는 모릅니다.목적은 심플한 크로스 플랫폼소켓 서버를 구현하는 것입니다.

POSIX 소켓과 Winsock 소켓의 차이와 크로스 플랫폼 네트워크 코드 작성 방법에 대해 설명해 주시겠습니까?

WinSock과 POSIX 소켓 비교

WinSock 소켓과 POSIX 소켓은 비슷한 방식으로 작동합니다. 주로 Windows 소켓이 원래 BSD의 코드를 기반으로 했기 때문입니다.

이러한 BSD 파생상품은 1990년대에 UNIX System V Release 4 및 OSF/1 시스템으로 대체되었지만(둘 다 BSD 코드를 통합하고 다른 현대 Unix 시스템의 기초가 됨), 이후 BSD 릴리즈는 FreeBSD, OpenSDB와 같은 여러 오픈 소스 개발 프로젝트의 기초를 제공하였다.진행 중입니다.또, 이것들은 Microsoft WindowsTCP/IP(IPv4 만) 네트워크 코드나 Apple 의 OS X 와 iOS 의 대부분의 기초 등, 최신의 독자적인 operating system의 전체 또는 일부에 짜넣어지고 있습니다.

다만, 「Socket-Library-agnostic(소켓 라이브러리 아그노스틱)」코드를 기술하는 경우는, 몇개의 다른 처리를 실시할 필요가 있습니다.

주의: 다음 예시는 코드를 사용하여 테스트되었습니다.Windows XP(x86) 및 Debian Testing(AMD64)에서의 블록과 GCC.

헤더 파일과 lib 파일이 다릅니다.

Windows 사용 여부에 따라 다른 헤더 파일을 포함해야 합니다.

#ifdef _WIN32
  /* See http://stackoverflow.com/questions/12765743/getaddrinfo-on-win32 */
  #ifndef _WIN32_WINNT
    #define _WIN32_WINNT 0x0501  /* Windows XP. */
  #endif
  #include <winsock2.h>
  #include <Ws2tcpip.h>
#else
  /* Assume that any non-Windows platform uses POSIX-style sockets instead. */
  #include <sys/socket.h>
  #include <arpa/inet.h>
  #include <netdb.h>  /* Needed for getaddrinfo() and freeaddrinfo() */
  #include <unistd.h> /* Needed for close() */
#endif

다음 링크도 필요합니다.Ws2_32lib 파일을 사용합니다.

WinSock은 초기화 및 청소가 필요합니다.

다음 기능은 WinSock v1.1을 초기화하고 정리하는 방법을 보여줍니다.

int sockInit(void)
{
  #ifdef _WIN32
    WSADATA wsa_data;
    return WSAStartup(MAKEWORD(1,1), &wsa_data);
  #else
    return 0;
  #endif
}

int sockQuit(void)
{
  #ifdef _WIN32
    return WSACleanup();
  #else
    return 0;
  #endif
}

소켓 핸들이 Winsock에서 서명되지 않음

POSIX 스타일 소켓의 경우 간단히int소켓 핸들을 저장합니다.유효하지 않은 소켓은 음의 값으로 표시됩니다.

단, WinSock 소켓은 특별한 상수가 있는 서명되지 않은 정수입니다.INVALID_SOCKET음수 대신 )를 사용합니다.

.typedef을 「」로 .int매크로 또는 함수 뒤에 "유효한 소켓" 체크를 숨깁니다.

소켓이 다르게 닫힙니다.

아래 함수는 차이점을 보여줍니다.

/* Note: For POSIX, typedef SOCKET as an int. */

int sockClose(SOCKET sock)
{

  int status = 0;

  #ifdef _WIN32
    status = shutdown(sock, SD_BOTH);
    if (status == 0) { status = closesocket(sock); }
  #else
    status = shutdown(sock, SHUT_RDWR);
    if (status == 0) { status = close(sock); }
  #endif

  return status;

}

하지만 대체로 비슷합니다.

「공통 「공통」등을하고 있는 :send() ★★★★★★★★★★★★★★★★★」recv()플랫폼 고유의 것( 등)을 피하면 문제가 없습니다.

또한 다양한 컴파일러를 사용하여 Windows 및 UNIX 시스템(프로젝트 페이지 전체 목록 참조)에서 작동하는 plibsys 라이브러리도 제안할 수 있습니다.IPv4 및 IPv6 를 서포트합니다.여기에는 사용 예를 볼 수 있는 테스트가 있습니다.라이브러리 자체는 가볍고 휴대성이 뛰어납니다.

크로스 플랫폼 소켓을 지원하는 라이브러리 및 툴킷은 여러 가지가 있으며, 작업에 따라 다음과 같이 사용할 수 있습니다.

  • 열리다
  • Apache 휴대용 런타임
  • libtcl

외부 라이브러리에 의존하지 않으려면 위의 모든 패키지가 상당히 허용 가능한 라이센스를 가지고 있으므로 해당 코드를 참조로 사용할 수 있습니다.

표준 소켓(AF_에 있는 소켓)소켓 서버를 구축하기 위해 필요한 INET 주소 패밀리)는 모든 플랫폼에서 동일하게 지원됩니다.

Unix 소켓(AF_에 있는 소켓)과 혼동하지 마십시오.UNIX 주소 패밀리) - 이러한 소켓은 Unix 월드 전용으로 매우 특정 목적에 사용됩니다.심플한 소켓 서버 애플리케이션에는 필요 없습니다.

언급URL : https://stackoverflow.com/questions/28027937/cross-platform-sockets

반응형