문제
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_set
S는 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 링크 할 별도의 라이브러리가 없습니다.
이것을보세요 ... http://sourceforge.net/projects/cpp-sockets/