2010-02-23 2 views
3

Я новичок в C89, и пытается сделать некоторые сокет программирования:C89: getaddrinfo() в Windows?

void get(char *url) { 
    struct addrinfo *result; 
    char *hostname; 
    int error; 

    hostname = getHostname(url); 

    error = getaddrinfo(hostname, NULL, NULL, &result); 

} 

Я разрабатываю на Windows. Visual Studio жалуется, что такого файла нет, если я использую следующие заявления:

#include <sys/types.h> 
#include <sys/socket.h> 
#include <netdb.h> 

Что мне делать? Означает ли это, что у меня не будет мобильности для Linux?

ответ

6

В 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 

Затем, когда вы делаете что-то вроде этого, вы можете кодировать с функциями, которые появляются в обеих ОС, используя эти обертки, где это необходимо.

+0

Означает ли это, что у меня не будет переносимости в Linux? Является ли API полностью отличным от Linux? –

+0

@ Rosarch Я обновил свой ответ, чтобы отразить некоторые ваши вопросы. – asveikau

+0

Вы, вероятно, извлечь выгоду из этих http://tangentsoft.net/wskfaq/articles/lame-list.html http://beej.us/guide/bgnet/ –