Портирование Winsock на Linux Sockets - PullRequest
7 голосов
/ 06 января 2011

У меня есть программа, которая работает в сети, используя Winsock, и одним из наших требований сейчас является перенос нашей программы на Linux.Единственное, что мешает нам это сделать, - это Винсок.

Мой вопрос таков: насколько легко я могу перенести это на реализацию Linux?

Есть ли какие-то подводные камни, о которых мне следует знать, и если я просто включу соответствующие файлы заголовков, какого родая должен быть уверен, что справлюсь?

Спасибо за любую помощь!

Я бы отправил код, но, к сожалению, не могу по юридическим причинам.Но наш код использует следующее:

WSAStartup(..)
WSACleanup(..)
Socket(..)
sendto(..)
recvfrom(..)
ioctlsocket(..)
setsocketopt(..)

Ответы [ 4 ]

8 голосов
/ 06 января 2011

На основании этого списка функций все должно работать более или менее просто. Добавьте #if _WIN32 вокруг вызовов к WSAStartup и WSACleanup (эквивалент linux ничего не делает, библиотека сокетов инициализируется автоматически).

Вам также может понадобиться некоторый код, зависящий от ОС, при настройке параметров сокетов, некоторые из них одинаковы, некоторые нет, а типы могут отличаться.

7 голосов
/ 06 января 2011

Это будет зависеть от того, используете ли вы какие-либо сетевые функциональные возможности Windows или если вы используете в основном API, совместимый в основном с BSD.

Итак, если вы используете перекрывающиеся порты завершения ввода-вывода и ввода-вывода и другие расширенные части Winsock API, то будет очень сложно портировать вещи, и если вы просто используете BSD-совместимые компоненты, тогда Легко написать тонкий слой перевода или даже просто запустить и выключить winsock внутри определенного окна ifdef ...

Это может помочь: http://tangentsoft.net/wskfaq/articles/bsd-compatibility.html

4 голосов
/ 06 января 2011

Единственными вызовами, которые затрудняют перенос, являются вызовы WSA *.

WSAStartup () -> nop WSACleanup () -> nop

Socket / setsockopt -> socket / setsockopt

Под * nix сокеты блокируются по умолчанию, и нет необходимости или невозможно использовать этот странный вызов setsockopt, чтобы поиграть с ним.

ioctlsocket -> ioctl

Под * nix мыне очень люблю асинхронные сокеты и предпочитаю использовать системный вызов select ().

---- Остальная часть этого ответа, кажется, относится только к Win95-совместимому winsock ----

К сожалению, поскольку в некоторых случаях оригинальный сокет () в Winsock был поврежден, вы, вероятно, использовали WSASocket () и поэтому должны конвертировать эти вызовы.

0 голосов
/ 06 января 2011

Не видя код, сложно сказать, насколько это просто. Но вы должны иметь возможность заменить вызовы winsock на аналоги в sys / sockets.h.

...