уметь заменять вызовы winsock на аналоги в sys / sockets.h.

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

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

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

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

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

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

Ответы на вопрос(4)

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

Сокет / setsockopt -> Сокет / setsockopt

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

ioctlsocket -> ioctl

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

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

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

 Joshua07 янв. 2011 г., 04:58
Бен Фойгт: точно. Вызов windows setsockopt вызывается по дескриптору NULL и устанавливает режим для всех новых сокетов.
 Joshua07 янв. 2011 г., 18:08
Забавно, я больше не могу найти документацию в Интернете. Возможно, из-за того, что я все еще использовал Win9x-совместимый номер версии winsock в процессе инициализации, было странное поведение.
 Ben Voigt07 янв. 2011 г., 04:29
не возможно возиться с блокировкой?Можно сделать неблокирующий ввод / вывод для сокетов, установив флаг O_NONBLOCK для дескриптора файла сокета с помощью fcntl (2). Вы правы, хотя это другая функция, а неsetsockopt.
 Mike Bailey06 янв. 2011 г., 18:25
Наш код использует socket (), я опубликовал, какие функции используются в коде, так как я не могу опубликовать реальный код.
 Ben Voigt07 янв. 2011 г., 15:21
Я никогда не звонилsetsockopt на нулевой ручке. Где это поведение задокументировано?

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

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

Решение Вопроса

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

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

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

должен уметь заменять вызовы winsock на аналоги в sys / sockets.h.

Ваш ответ на вопрос