문제

C ++에서 소켓 관련 제품을 개발하려고하는데 소프트웨어가 처음부터 가능한 한 Windows와 Linux 사이에 휴대용이되기를 원합니다 (나중에 휴대 가능성이 까다로워집니다.)

나는 다른 라이브러리를 보았습니다. alhem.net 물론 부스트 :: asio가 있습니다. Boost :: Asio는 매우 유망한 것처럼 보이지만이 작은 응용 분야에 매우 큰 의존성이 될 것입니다.

물건을 직접 쓸 가치가 있습니까? 아니면 도서관을 사용해야합니까? 내가 직접한다면 주요 함정은 무엇입니까?

도움이 되었습니까?

해결책

Winsocks는 Posix 소켓과 호환되지 않습니다.

  • Winsocks에서 소켓은 유형입니다 SOCKET. POSIX에서는 단순히 파일 디스크립터입니다 (int), 정상을 수행 할 수 있습니다 read() 그리고 write() 전화.
  • 그들은 같은 방식으로 오류를 반환하지 않습니다.
  • 그들은 몇 가지 옵션을 지원하지 않습니다 recv() 그리고 send().
  • 두 개의 스페셜 기능으로 Winsocks 라이브러리를 초기화하고 단위화해야합니다.
  • 나는 당신이 Windows 소켓을 닫을 수 있다고 생각하지 않습니다 shutdown() 또는 close(). 그것은 같은 것입니다 closesocket() 대신에.

더 많은 차이점이 있어야하지만 그것이 바로 지금 기억할 수있는 것입니다. Winsocks를 사용하여 휴대 성을 원한다면 소켓을 닫고 오류 메시지를 인쇄하기위한 작은 라이브러리가 있습니다.

나는 아마 함께 갈 것입니다 boost::asio, 개인적으로 (나는 그것을 사용한 적이 없다).

다른 팁

소켓 주위에 휴대용 포장지 몇 개를 개발했습니다. Winsock2 이벤트로 구성된 귀환이없는 엉뚱한 차선을 내려 가지 마십시오. 그 외에는 내가 알 수 있듯이 가장 큰 차이점은 다음과 같습니다.

  • Windows에서 네트워킹을 시작하려면 ::WSAStartup(), Windows에서 종료하려면 실행하십시오 ::WSACleanup(); Linux에서는 아무것도하지 않습니다.
  • close() 리눅스에서 closesocket() 창문에서
  • 기본 버퍼 크기는 드라이버와 운영 체제 모두에 따라 다르므로 사용 설정을 설정하십시오. SO_RCVBUF 그리고 SO_SNDBUF,
  • SO_Reuseaddr는 Windows에서 주소를 훔치고 Linux에서 자주 재개 할 수 있습니다. 아마도이 깃발 만 Linux에서만 사용하고 싶을 것입니다.
  • 소켓 비 블로킹 용도를 만듭니다 ::ioctlsocket() 창문에서 ::fcntl() Linux에서
  • 헤더 파일은 다르고 <sys/socket.h> 그리고 Linux의 친구들, <WinSock.h> 창문에서
  • 휴대하기 위해 가장 쉬운 방법은 아마도 사용하는 것입니다. ::select() 데이터가 도착할 때까지 기다리려면
  • fd_setS는 Windows/Linux에서 완전히 다릅니다. 초기화를 최적화 해야하는 경우에만 관련이 있습니다. fd_set임의의 소켓을 추가/제거 할 때와 같은 S,
  • Windows에서는 소켓에 매달려있는 모든 스레드가 소켓이 닫히면 오류 코드로 해제됩니다. Linux에서는 스레드가 대기 상태로 유지됩니다. 예를 들어 스레드가 소켓을 차단하는 경우 ::recvfrom(), 당신은 사용을 고려할 수 있습니다 ::sendto() Linux에서 스톨 링 스레드를 해제합니다.

내가 필요한 다른 모든 것은 방금 Låda에서 일했습니다.

"ACE (Adaptive Communications Environment)"(ACE) 라이브러리를 살펴보십시오.(에이스 홈페이지)그것은 Windows, MacOS 및 Linux를 지원하는 휴대용 라이브러리에서 좋은 추상화와 많은 유연성을 제공합니다. 그것은 약간의 가파른 학습 곡선을 가지고 있지만, 나는 그것으로부터 매우 좋은 가치를 얻었습니다.

소켓을 얼마나 많이 사용합니까? 소켓 재료가 꽤 높은 수준 (오픈, 읽기, 쓰기) 인 여러 앱을 수행했으며 Windows에서 Linux로 완벽하게 작동했습니다. 그 이상이라면 부스트로 가십시오.

솔직히, 나는 Boost :: Asio를 첫 번째 선호도로 사용합니다. Sockets API로 실제로 내려 가거나 더러워 지려면 Windows와 Linux에서 표준 BSD 스타일 소켓 API를 사용할 수 있습니다. Windows에서는 Winsock2에 링크 (및 초기화)해야합니다. Linux 링크 할 별도의 라이브러리가 없습니다.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top