2010-06-01 14 views
19

Sto tentando di utilizzare le funzioni socket.h in Windows. In sostanza, attualmente sto esaminando il codice di esempio http://beej.us/guide/bgnet/output/html/multipage/clientserver.html#datagram. Capisco che socket.h è una funzione Unix - c'è comunque che posso facilmente emulare quell'ambiente durante la compilazione di questo codice di esempio? Un diverso IDE/compilatore cambia qualcosa?Utilizzo delle funzioni sys/socket.h su windows

Altrimenti, immagino di dover utilizzare un ambiente Linux virtualizzato, che potrebbe essere comunque il migliore in quanto il codice verrà probabilmente eseguito in un ambiente UNIX.

Grazie.

risposta

29

Sono disponibili due opzioni:

  1. Usa Cygwin (libreria di emulazione Unix).
  2. Porta a Winsock (libreria standard di Windows).

La prima opzione consente di compilare i sorgenti di Unix in gran parte intatta, ma si lega alla biblioteca Cygwin di emulazione (che implica due cose in fase di esecuzione: le prestazioni generali -no solo Network- sarà probabilmente inferiore a ottimale; e l'ambiente in esecuzione deve avere la DLL Cygwin disponibile). La seconda alternativa richiede di sostituire sys/socket.h (libreria socket BSD, standard UNIX per stack TCP/IP) con winsock2.h e riscrivere alcune parti del codice, non molto, ma alcune.

Alcune questioni connesse con informazioni preziose:

Differences between winsock and BSD socket implementations

Some Issues About Cygwin[Linux in Windows] (socket,thread,other programming and shell issues)

Examples for Winsock?

+1

+1 per winsock ed esempi. Ho usato Winsock. Ho solo bisogno di cambiare una piccola parte dei codici per portare il mio programma Unix su Windows. È facile. – user172818

+1

Ma ci sono altre sorprese nell'altro caso :) Ad esempio, 'select' su windows ignora il primo argomento, quindi naturalmente, i programmatori di winsock mettono zero lì per' maxfd'. Dolore reale :) –

0

Penso che stiate cercando la libreria Winsock.

1

Scrittura di applicazioni di rete piattaforma croce non è facile con ciò che la norma BSD fornisce. Certo che funzionerà, ma dovrai fare alcuni rimpiazzi come sostituire ioctl (se necessario) con ioctlsocket (su Windows). Altre differenze here.

Il mio consiglio è di usare una libreria che nasconda queste brutte differenze e fornisca un modo unificato di comunicare. Io personalmente uso ACE. Hai un sacco di esempi che ti mostrano come creare un server e un client. Copia dagli esempi e guarda come lo fanno lì. Anche le loro mailing list sono di grande aiuto (non dimenticare di usare il PRF - vedi l'albero dei sorgenti per il modulo di segnalazione dei problemi). Puoi prendere in prestito i libri per ulteriori informazioni. Nota importante: usando asso è possibile utilizzare le funzioni del wrapper ACE come socket, setsockopt, ioctl ecc. Senza preoccuparsi che non funzionino. Sfortunatamente questo aggiunge una dipendenza di libreria che non è sempre un'opzione. Ma ACE ha caratteristiche più potenti che sono sicuro che ti piaceranno una volta che li scoprirai. Suggerimenti: reattore, proactor.

Problemi correlati