problème avec les sockets pour passer de windows a linux

problème avec les sockets pour passer de windows a linux - C++ - Programmation

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)

Code :
  1. //#include <winsock2.h>
  2. #include <pi-socket.h>
  3. #include <semaphore.h>
  4. #include <pi-sockaddr.h>
  5. #include <sys/types.h>
  6. #include <sys/socket.h>
  7. #include <linux/socket.h>
  8. #include <iostream.h>
  9. #include <fstream.h>
  10. //#pragma comment(lib, "ws2_32.lib" )
  11. #define bufferLength 5
  12. class clientProgram
  13. {
  14. private :
  15. int mySocketServer;//used to define the server's socket
  16. int mySocketClient;//used to define the client's socket
  17. sockaddr_in sockInfoClient ;
  18. SOCKADDR_IN sockInfoServer ;//technical infos of the socket:
  19. //(port, éventually ip adress
  20. WSADATA MyWsaData; //used for WSAStartup in the constructor


 
 
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
Reply

Marsh Posté le 09-12-2005 à 17:48:59   

Reply

Marsh Posté le 12-12-2005 à 15:33:29    

up  :(

Reply

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


Message édité par Profil supprimé le 12-12-2005 à 15:39:49
Reply

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"


Message édité par TheShot le 12-12-2005 à 16:02:24
Reply

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

Reply

Marsh Posté le 12-12-2005 à 16:14:18    

mince  :(  
merci pour l'info

Reply

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.


Message édité par Profil supprimé le 14-12-2005 à 14:11:39
Reply

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 :
  1. #include <sys/types.h>
  2. #include <sys/socket.h>
  3. #include <netinet/in.h>
  4. #include <arpa/inet.h>
  5. #include <unistd.h>
  6. #include <sys/un.h>


 
Et s'il en manque encore :

Code :
  1. <netdb.h>
  2. <resolv.h>


 

Reply

Marsh Posté le 28-12-2005 à 01:16:54    


 
non , elle existe aussi sous linux...

Reply

Marsh 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


Message édité par Profil supprimé le 05-01-2006 à 15:08:28
Reply

Marsh Posté le 05-01-2006 à 15:04:44   

Reply

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) [:pingouino]

Reply

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) [:pingouino]


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...  :heink:  

Reply

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

Reply

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


Message édité par Profil supprimé le 05-01-2006 à 18:20:27
Reply

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)

Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed