problème avec les sockets pour passer de windows a linux - C++ - Programmation
Marsh Posté le 12-12-2005 à 15:34:14
wsa est spécifique à windows (c'est windows socket 2 de microsoft donc non portable)
tu peux piocher dans wxwindows ou qt pour faire du socket multiOS
aussi la lib ACE http://www.cs.wustl.edu/~schmidt/ACE.html qui est bien puissante
Marsh Posté le 12-12-2005 à 15:58:20
Merci mais l'idéal pour moi serait de porter mon programme socket windows vers linux pour avoir un minimum de changements à faire. Pourriez vous m'éclairer sur les .h et notamment sur ce qui pourrait remplacer ceci sous linux :
WSAStartup(MAKEWORD(2,0), &MyWsaData);//do that we will use sockets,
//the first parameter specify the winsock's version
//which is a library which allow of using sockets
//the second parameter is used for the beginning of WSAStartup().
et pourquoi le type
« sockaddr_in »
n'est pas reconnu ?
j'ai cette erreur avec :
erreur: field sockInfoClient has incomplete type
où sockInfoClient est de type "struct sockaddr_in"
Marsh Posté le 12-12-2005 à 16:09:08
lol
il ne s'agit pas de ce qui t'arrange mais de ce qui est possible
la structure sockaddr_in est spécifique aux winsocks
déso mais tu vas être obligé de porter cqfd
Marsh Posté le 14-12-2005 à 14:09:36
d'ailleurs pendant que j'y pense tu dois porter les sockets mais zaussi les threads car c'est pas pareil entre windows et linux, tu t'adresses au système dans les deux cas. si tu n'as pas une couche qui abstrait l'interfaçage avec le système (ace,qt,wxwindows) tu dois réécrire ton code en partie tout du moins.
Marsh Posté le 26-12-2005 à 19:12:22
pour les thread :
http://www.opengroup.org/onlinepub [...] ead.h.html
http://www.yolinux.com/TUTORIALS/L [...] reads.html
ensuite les sockets c'est plus simple sous linux mais ya pa smal d'includes à changer
http://gnosis.cx/publish/programming/sockets.html explication de la création client et serveur avec tout ce qu'il faut :
perso j'utilise :
Code :
|
Et s'il en manque encore :
Code :
|
Marsh Posté le 28-12-2005 à 01:16:54
ReplyMarsh Posté le 05-01-2006 à 15:04:44
gocho a écrit : non , elle existe aussi sous linux... |
oups
http://www.spi.ens.fr/~beig/systeme/sockets.html
ceci dit, même si tu gardes cette structure ( partie émergée de l'iceberg et pas grand chose dedans ) il va falloir adapter le reste
Marsh Posté le 05-01-2006 à 15:14:10
l'API winsock2 dispo sous windows est celle des berkeley sockets, il me semble, donc directement utilisable sous linux (d'ailleurs, je n'ai jamais eu à me soucier de ca pour mes projets cross platform du temps où j'en faisais encore, mise à part pour les WSA_Startup ou choses du genre pour initialiser ou fermer la lib)
Marsh Posté le 05-01-2006 à 15:35:27
theshockwave a écrit : l'API winsock2 dispo sous windows est celle des berkeley sockets, il me semble, donc directement utilisable sous linux (d'ailleurs, je n'ai jamais eu à me soucier de ca pour mes projets cross platform du temps où j'en faisais encore, mise à part pour les WSA_Startup ou choses du genre pour initialiser ou fermer la lib) |
euh les wsa machin truc ne servent pas qu'à initialiser et fermer la lib... tu écris que l'api winsock est directement utilisable sous linux sauf qu'il faut modifier quelques trucs à droite à gauche...
Marsh Posté le 05-01-2006 à 17:07:57
j'ai pas dit à droite à gauche ... J'ai parlé d'init et de fermeture de la lib, chose que tu peux faire sur toute la durée de vie de ton programme, donc généralement hors de ta lib qui est en charge des sockets, dans un main spécifique à windows ou je ne sais quoi, je ne connais pas l'architecture que tu choisis sur tes projs, mais persos, mes sources pour libs de sockets (sous nux comme sous win) sont identiques
Marsh Posté le 05-01-2006 à 17:33:35
ça dépend comment le code est fait sans doute
j'ai d'autres appels spécifiques à WSA que l'init et la fermeture, pour l'asynchrone et la gestion d'erreurs notamment
mais j'imagine que si tu décorelles la partie WSA de la partie Berkeley il n'y a plus de problème de portage pour la partie Berkeley
Marsh Posté le 05-01-2006 à 18:55:03
oui, effectivement, j'avais oublié le problème des setsockopt permettant le mode asynchrone pour les sockets, au temps pour moi (et là, ce n'est pas du WSA)
Marsh Posté le 09-12-2005 à 17:48:59
Salut !
Je suis en train de porter un programme windows vers linux qui utilise les sockets et les threads. Le programme fonctionne sous windows mais pas avec linux.
voici mes erreurs suivies d'un bout de code :
socketClient.cpp:20: erreur: « sockaddr_in » ne nomme pas un type
socketClient.cpp:21: erreur: « SOCKADDR_IN » ne nomme pas un type
socketClient.cpp:23: erreur: « WSADATA » ne nomme pas un type
socketClient.cpp: In constructor `clientProgram::clientProgram()':
socketClient.cpp:41: erreur: « MAKEWORD » non déclaré (première utilisation dans cette f onction)
socketClient.cpp:41: erreur: (Chaque identificateur non déclaré est rapporté seulement u ne seule fois pour la fonction dans laquelle il apparaît.)
socketClient.cpp:41: erreur: « MyWsaData » non déclaré (première utilisation dans cette fonction)
socketClient.cpp:41: erreur: « WSAStartup » non déclaré (première utilisation dans cette fonction)
socketClient.cpp: In member function `void clientProgram::readFile()':
socketClient.cpp:61: erreur: « sockInfoServer » non déclaré (première utilisation dans c ette fonction)
socketClient.cpp: In member function `void clientProgram::specificationsServer()':
socketClient.cpp:82: erreur: « sockInfoServer » non déclaré (première utilisation dans c ette fonction)
socketClient.cpp:82: erreur: « inet_addr » non déclaré (première utilisation dans cette fonction)
socketClient.cpp:85: erreur: « htons » non déclaré (première utilisation dans cette fonc tion)
socketClient.cpp:90: erreur: « SOCKADDR » non déclaré (première utilisation dans cette f onction)
socketClient.cpp:90: erreur: expected primary-expression avant un élément lexical « ) »
socketClient.cpp: In member function `void clientProgram::specificationsClient()':
socketClient.cpp:98: erreur: « sockInfoClient » non déclaré (première utilisation dans c ette fonction)
socketClient.cpp:98: erreur: « inet_addr » non déclaré (première utilisation dans cette fonction)
socketClient.cpp:101: erreur: « htons » non déclaré (première utilisation dans cette fon ction)
socketClient.cpp: In member function `void clientProgram::clientConnections()':
socketClient.cpp:115: erreur: « closesocket » non déclaré (première utilisation dans cet te fonction)
socketClient.cpp:116: erreur: « WSACleanup » non déclaré (première utilisation dans cett e fonction)
comme vous pouvez le voir, j'ai aussi quelques problèmes pour trouver les bons include et pour savoir si WSADATA est propre a windows (si oui, quel est son "remplaçant" sous LINUX ?)
Message édité par TheShot le 09-12-2005 à 17:49:22