2011-01-06 13 views
5

Possiedo un programma che esegue alcune attività di rete utilizzando Winsock e uno dei nostri requisiti ora è il porting sul nostro programma su Linux. L'unica cosa che ci impedisce di farlo è Winsock.Porting Winsock su socket Linux

La mia domanda è: quanto è facile portarlo su un'implementazione Linux?

Ci sono delle insidie ​​di cui dovrei essere a conoscenza, e se includo semplicemente i file di intestazione appropriati, che genere di cose dovrò essere sicuro di gestire?

Grazie per qualsiasi aiuto!

Scriverei codice ma purtroppo non è possibile a causa di motivi legali. Ma, il nostro codice non utilizzare il seguente:

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

risposta

6

Dipenderà se si utilizzano funzionalità di rete specifiche di Windows o se si utilizza principalmente l'API per lo più BSD compatibile.

Quindi, se si utilizzano porte di completamento I/O e I/O sovrapposte e altre parti avanzate dell'API Winsock, le cose saranno molto difficili da eseguire e se si utilizza solo la roba compatibile con BSD, allora dovrebbe essere facile scrivere uno strato sottile di traduzione o anche solo avere l'avvio del Winsock e roba arresto all'interno di una specifica finestre ifdef ...

questo può aiutare: http://tangentsoft.net/wskfaq/articles/bsd-compatibility.html

0

Senza vedere il codice, è difficile dire quanto sia facile. Ma tu dovresti essere in grado di sostituire le chiamate Winsock agli analoghi in sys/sockets.h.

3

Le sole chiamate che rendono difficile il porting sono le chiamate WSA *.

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

Socket/setsockopt -> presa/setsockopt

Sotto * nix, prese bloccano per impostazione predefinita e non è possibile o necessario utilizzare quel bizzarro setockopt chiama a giocherellare con esso.

ioctlsocket -> ioctl

Sotto * nix non ci piace prese asincroni tanto e preferiscono usare la chiamata di sistema select().

---- resto di questa risposta sembra solo di applicare per il Winsock compatibile Win95 ----

WSASocket Purtroppo, come la presa originale() in Winsock è stato rotto in alcuni casi, probabilmente usato() e quindi devo convertire quelle chiamate.

+0

Il nostro codice utilizza socket(), ho postato quali funzioni sono utilizzate nel codice, in quanto non posso pubblicare il codice effettivo. –

+0

non è possibile smanettare con il blocco? [È possibile eseguire I/O non bloccanti sui socket impostando il flag O_NONBLOCK su un descrittore di file socket utilizzando fcntl (2).] (Http://linux.die.net/man/7/socket) Si ' giusto però che è una funzione diversa, non 'setsockopt'. –

+0

Ben Voigt: esattamente. La chiamata windows setsockopt viene richiamata sull'handle NULL e imposta la modalità per tutti i nuovi socket. – Joshua

8

sulla base di tale lista di funzioni, le cose dovrebbero più o meno solo lavoro. Aggiungi #if _WIN32 alle chiamate a WSAStartup e WSACleanup (l'equivalente di linux è non fare nulla, la libreria di socket viene inizializzata automaticamente).

Potrebbe anche essere necessario un codice dipendente dal sistema operativo quando si impostano le opzioni di socket, alcune sono uguali, altre no e i tipi potrebbero essere diversi.