В Windows вместо включает в себя вы упомянули, следующее должно хватить:
#include <winsock2.h>
#include <windows.h>
Вы должны будете также ссылки на ws2_32.lib
. Это своего рода некрасиво делать это так, но для VC++ вы можете сделать это с помощью: #pragma comment(lib, "ws2_32.lib")
Некоторые другие различия между Winsock и POSIX включают в себя:
Вы должны будете звонить WSAStartup()
перед использованием любого сокета функции.
close()
теперь называется closesocket()
.
Вместо передачи розеток как int
, существует typedef SOCKET
, равный размеру указателя. Вы по-прежнему можете использовать сравнения с -1
для ошибки, хотя у Microsoft есть макрос с именем INVALID_SOCKET
, чтобы скрыть это.
Для таких вещей, как установка неблокирующих флагов, вы будете использовать ioctlsocket()
вместо fcntl()
.
Вы должны будете использовать send()
и recv()
вместо write()
и read()
.
Что касается того, или нет, вы потеряете портативность с кодом Linux, если вы начинаете кодирования для Winsock ... Если вы не будете осторожны, то да. Но вы можете написать код, который пытается устранить пробелы, используя #ifdef
сек ..
Например:
#ifdef _WINDOWS
/* Headers for Windows */
#include <winsock2.h>
#include <windows.h>
#else
/* Headers for POSIX */
#include <sys/types.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <netdb.h>
/* Mimic some of the Windows functions and types with the
* POSIX ones. This is just an illustrative example; maybe
* it'd be more elegant to do it some other way, like with
* a proper abstraction for the non-portable parts. */
typedef int SOCKET;
#define INVALID_SOCKET ((SOCKET)-1)
/* OK, "inline" is a C99 feature, not C89, but you get the idea... */
static inline int closesocket(int fd) { return close(fd); }
#endif
Затем, когда вы делаете что-то вроде этого, вы можете кодировать с функциями, которые появляются в обеих ОС, используя эти обертки, где это необходимо.
Означает ли это, что у меня не будет переносимости в Linux? Является ли API полностью отличным от Linux? –
@ Rosarch Я обновил свой ответ, чтобы отразить некоторые ваши вопросы. – asveikau
Вы, вероятно, извлечь выгоду из этих http://tangentsoft.net/wskfaq/articles/lame-list.html http://beej.us/guide/bgnet/ –