2009-05-06 5 views
6

Я собираюсь разработать некоторые сокеты связанных вещи в C++ и хотел бы программное обеспечение, чтобы быть переносимым между ОС Windows и Linux как можно с самого начала (что делает его портативным позже сложно.)Winsock 2 портативности

Я просмотрел разные библиотеки, есть один для C++ от alhem.net и, конечно же, есть boost :: asio. boost :: asio выглядит очень многообещающим, но будет очень большой зависимостью для приложений, которые это мало.

Стоит ли даже писать материал самостоятельно или я должен просто использовать библиотеку? Если я сделаю это сам, каковы будут основные подводные камни?

ответ

3

Winsocks не очень совместимы с Posix розеток:

  • В Winsocks сокет имеет тип SOCKET. В Posix это просто файловый дескриптор (int), на котором вы можете выполнять обычные вызовы read() и write().
  • Они не возвращают ошибки одинаково.
  • Они не поддерживают некоторые параметры на recv() и send().
  • Вы должны инициализировать и унифицировать библиотеку Winsocks с помощью двух специальных функций.
  • Я не думаю, что вы можете закрыть розетки Windows с помощью shutdown() или close(). Вместо этого это что-то вроде closesocket().

Должно быть больше различий, но это то, что я помню прямо сейчас. Если вы хотите переносить с помощью Winsocks, у вас будет небольшая библиотека для закрытия сокета, печати сообщения об ошибке и т. Д.

Я бы, вероятно, пошел с boost::asio, лично (я его никогда не использовал).

+0

Хорошо, я посмотрю, что я делаю. Boost :: asio имеет интерфейс ICMP, который очень хорош, поэтому в настоящее время он выглядит так, как я буду использовать. – Skurmedel

+0

shutdown () является допустимой функцией для сокетов Windows. Правильно ли вы используете closesocket(). –

+1

closeesocket - это просто версия для Windows, поэтому они не должны перегружать функцию закрытия. tHAVE, чтобы закрыть файл/сокет, но если вы этого не сделаете, вы можете получить потерю данных. WSAGetLastError - это просто функция windows, чтобы получить errno, поскольку API окон не поддерживал errno одинаково. И для сокетов POSIX поддерживает «отправку» и «recv» версий чтения и написать. – david

1

Честно говоря, я бы использовал boost :: asio в качестве первого предпочтения. Если вы действительно хотите спуститься и испортить API сокетов, вы можете использовать стандартный API сокетов BSD в Windows и Linux - это просто, что в Windows вам придется ссылаться на (и инициализировать) Winsock2, тогда как на Linux у вас не будет отдельной библиотеки, с которой можно связать.

+0

Спасибо за совет. +1 это, может только отметить один ответ :( – Skurmedel

1

Сколько сокетов вы будете использовать? Я сделал несколько приложений, где материал сокета был довольно высокого уровня (открытый, прочитанный, написанный) и отлично работал с Windows на Linux. Если это более того - идти с повышением.

+0

Сначала это был бы очень низкий уровень, например, открыть соединение, написать что-нибудь, прочитать, выйти. Вероятно, это может быть связано с Http-файлом. – Skurmedel

+0

Спасибо за совет +1, это может только отметить один ответ :( – Skurmedel

5

Я разработал несколько переносных оберток вокруг сокетов. Удостоверьтесь, что вы не спускаетесь по дрянной переулке, откуда нет возврата, состоящего из событий WinSock2.Кроме того, как я это вижу, самые большие различия:

  • начать сети в Windows, вам нужно вызвать ::WSAStartup(), чтобы закрыть его в Windows, запустите ::WSACleanup(); в Linux не делать ничего,
  • close() в Linux в Windows, closesocket(),
  • размеры буфера по умолчанию различаются между обоими драйверами и операционными системами, поэтому убедитесь, что установить их с помощью SO_RCVBUF и SO_SNDBUF,
  • SO_REUSEADDR крадет адрес на Windows, , позволяет частое повторное открытие на Linux; вы, вероятно, хотите использовать этот флаг в Linux,
  • делает сокет неблокирующий использует ::ioctlsocket() в Windows, ::fcntl() в Linux,
  • файлы заголовки различны, <sys/socket.h> и друзья в Linux, <WinSock.h> в Windows,
  • идти портативный, самый простой способ, вероятно, использовать ::select() ждать данных, чтобы прибыть,
  • fd_set s совершенно разные на Windows/Linux; это актуально только в том случае, если вам необходимо оптимизировать инициализацию fd_set s, например, при добавлении/удалении произвольных сокетов,
  • в Windows, любая нить, висящая на сокете, выпущена с кодом ошибки при закрытии сокета, в Linux поток остается ждать. Если поток блокирует сокет, например, ::recvfrom(), вы можете подумать об использовании ::sendto(), чтобы освободить ниспадающий поток под Linux.

Все остальное, что мне когда-либо понадобилось, только что сработало из лады.

+0

Очень полезный совет. Tackar och bugar;). – Skurmedel

+0

Ты больше всего! –

2

Посмотрите в библиотеке (ACE) «Адаптивные связи окружающей среды»: (ACE Home Page) Это дает некоторые интересные абстракции и много гибкостей все свернуты в портативной библиотеке, которая поддерживает Windows, MacOS и Linux. У этого есть немного крутая кривая обучения, но я получил очень хорошее значение от этого.

+0

Спасибо за предложение. – Skurmedel

1

Посмотрите на это ... http://sourceforge.net/projects/cpp-sockets/

+0

Кажется весьма полезным. Спасибо друг. Это кажется довольно старым, хотя, последнее обновление 2003 года? Но, возможно, он все еще работает хорошо. – Skurmedel

 Смежные вопросы

  • Нет связанных вопросов^_^