[C++]send() entre win et linux
Fermé
lucichose
Messages postés
39
Date d'inscription
mardi 29 juillet 2008
Statut
Membre
Dernière intervention
7 mars 2012
-
7 juil. 2010 à 09:46
Char Snipeur Messages postés 9688 Date d'inscription vendredi 23 avril 2004 Statut Contributeur Dernière intervention 2 octobre 2020 - 8 juil. 2010 à 10:52
Char Snipeur Messages postés 9688 Date d'inscription vendredi 23 avril 2004 Statut Contributeur Dernière intervention 2 octobre 2020 - 8 juil. 2010 à 10:52
A voir également:
- [C++]send() entre win et linux
- Net send windows 10 ✓ - Forum Windows
- Émulateur linux ✓ - Forum Linux / Unix
- Linux su - Astuces et Solutions
- Win zip - Télécharger - Compression & Décompression
- Win 10 iso - Guide
6 réponses
Char Snipeur
Messages postés
9688
Date d'inscription
vendredi 23 avril 2004
Statut
Contributeur
Dernière intervention
2 octobre 2020
1 328
7 juil. 2010 à 09:56
7 juil. 2010 à 09:56
as tu essayé de Linux à Linux ?
une histoire de parefeu ?
peut être une taille de donnée qui n'est pas la même des deux cotés (sizeof(long) par exemple).
3 chose à vérifier(dans le désordre).
Bonne chance.
une histoire de parefeu ?
peut être une taille de donnée qui n'est pas la même des deux cotés (sizeof(long) par exemple).
3 chose à vérifier(dans le désordre).
Bonne chance.
lucichose
Messages postés
39
Date d'inscription
mardi 29 juillet 2008
Statut
Membre
Dernière intervention
7 mars 2012
7 juil. 2010 à 14:36
7 juil. 2010 à 14:36
alors pour la taille des données c'est bien les mêmes, de linux a linux cela ne fonctionne pas hormis si je me connecte directement sur l'adresse mais les send de broadcast ne passe pas.
Char Snipeur
Messages postés
9688
Date d'inscription
vendredi 23 avril 2004
Statut
Contributeur
Dernière intervention
2 octobre 2020
1 328
7 juil. 2010 à 14:51
7 juil. 2010 à 14:51
les send de broadcast ne passe pas.
Voilà qui est un peu plus précis et pourrait être la source du problème.
Déjà, le broadcast en mode connecté (tcp) je ne suis pas sur que ça ait un sens, mieux vaut de l'UDP.
Il est possible que sous Linux les messages broadcast soient filtrés... il faut se renseigner.
Voilà qui est un peu plus précis et pourrait être la source du problème.
Déjà, le broadcast en mode connecté (tcp) je ne suis pas sur que ça ait un sens, mieux vaut de l'UDP.
Il est possible que sous Linux les messages broadcast soient filtrés... il faut se renseigner.
lucichose
Messages postés
39
Date d'inscription
mardi 29 juillet 2008
Statut
Membre
Dernière intervention
7 mars 2012
7 juil. 2010 à 15:04
7 juil. 2010 à 15:04
non les broadcast, bien sur je les faient en UDP. quant je disaient qu'ils ne passaient pas c'etaient entre 2 linux. cependant win -> linux et linux-> win sa passe
Char Snipeur
Messages postés
9688
Date d'inscription
vendredi 23 avril 2004
Statut
Contributeur
Dernière intervention
2 octobre 2020
1 328
7 juil. 2010 à 15:44
7 juil. 2010 à 15:44
Dans ton premier message tu disais que win->linux ça ne passait pas.
lucichose
Messages postés
39
Date d'inscription
mardi 29 juillet 2008
Statut
Membre
Dernière intervention
7 mars 2012
7 juil. 2010 à 15:53
7 juil. 2010 à 15:53
oui les envois de paquet en tcp ne passe pas. mais en UDP sa marche dans les 2 sens
Char Snipeur
Messages postés
9688
Date d'inscription
vendredi 23 avril 2004
Statut
Contributeur
Dernière intervention
2 octobre 2020
1 328
7 juil. 2010 à 16:30
7 juil. 2010 à 16:30
Houlà, il faudrait me faire un résumé de la situation.
Si je comprends bien :
En tcp ne fonctionne pas de windows vers Linux.
En UDP ne fonctionne pas de linux-> linux.
Tout le reste fonctionne. Reste à comprendre pourquoi il y a un souci de windows à Linux en TCP. Met ta commande send stp.
Si je comprends bien :
En tcp ne fonctionne pas de windows vers Linux.
En UDP ne fonctionne pas de linux-> linux.
Tout le reste fonctionne. Reste à comprendre pourquoi il y a un souci de windows à Linux en TCP. Met ta commande send stp.
lucichose
Messages postés
39
Date d'inscription
mardi 29 juillet 2008
Statut
Membre
Dernière intervention
7 mars 2012
7 juil. 2010 à 16:58
7 juil. 2010 à 16:58
dans ce bout de code le pc est serveur il attend un message et si il en recois un il repond a son tour ( MODE TCP)
ici le pc est Client , une fois la connexion etablie, il envois un message au serveur ( Mode TCP ) :
int SelectServerThread::protectedRun ( )
{
while ( !bClose )
{
ID_IP.clear ( );
//Verouille le mutex
pthread_mutex_unlock ( &myMutex );
//Recuperation des donn?es des utilisateurs connect?s
((ServerMultiThreadLinux*)TheServer)->Get_myID_Ip_User ( ID_IP );
//Lock le mutex
pthread_mutex_lock ( &myMutex );
if ( !ID_IP.empty ( ) )
{
//Creation d'un iterateur au debut de la map
kstl::map < int, CONNEXION* >::iterator It = ID_IP.begin ( );
fd_set Set_Read;
fd_set Set_Exept;
fd_set Set_Write;
struct timeval tv;
tv.tv_sec = 0;
tv.tv_usec = 10000;
//Parcour de la map
while ( It != ID_IP.end ( ) )
{
//Initialisation des valeurs
myReader.clear ( );
myWriter.clear ( );
myExept.clear ( );
FD_ZERO ( &Set_Read );
FD_ZERO ( &Set_Exept );
FD_ZERO ( &Set_Write );
FD_SET ( ( *It ).second->Socket, &Set_Read );
FD_SET ( ( *It ).second->Socket, &Set_Write );
FD_SET ( ( *It ).second->Socket, &Set_Exept );
It++;
}
//Select
int iValue = select ( 0, &Set_Read, &Set_Write, &Set_Exept, &tv );
if ( iValue )
{
kstl::map < int, CONNEXION* >::iterator It = ID_IP.begin ( );
while ( It != ID_IP.end ( ) )
{
if ( FD_ISSET ( ( *It ).second->Socket, &Set_Read ) )
{
myReader.push_back ( ( *It ).second->Socket );
}
if ( FD_ISSET ( ( *It ).second->Socket, &Set_Write ) )
{
myWriter.push_back ( ( *It ).second->Socket );
}
if ( FD_ISSET ( ( *It ).second->Socket, &Set_Exept ) )
{
myExept.push_back ( ( *It ).second->Socket );
}
It ++;
}
}
//Iterateur reader
kstl::vector <int>::iterator ItReader = myReader.begin ( );
//Parcour du vecteur
while ( ItReader != myReader.end ( ) )
{
//erase buffer
for ( int i = 0; i < 200; i++ )
{
myMessage [i] = 0;
}
//reception du message
int iReceiveLenght = recv ( ( *ItReader ), myMessage, 200, 0 );
if ( iReceiveLenght > 0 )
{
printf ( "Paquet recu\n");
//Sauvegarde du message dans le buffer du serveur
TheServer->AddMessage ( myMessage, iReceiveLenght );
//Renvoi d'un r?ponse
kstl::string Message;
Message = "Reponse";
//Recuperation de la taille du message
int MessageLenght = Message.size ( );
//envois le message
send ( ( *ItReader ), Message.c_str ( ) , MessageLenght, 0 );
}
else
{
printf ( "Paquet non recu\n" );
}
//incr?mentation de l'iterateur
ItReader++;
}
}
}
return 0;
}
ici le pc est Client , une fois la connexion etablie, il envois un message au serveur ( Mode TCP ) :
bool ClientMultiThreadLinux::ConnectToAdress ( kstl::string strIP )
{
if ( !mybIsConnect )
{
//Address de destination
struct sockaddr_in DestAddr;
DestAddr.sin_family = AF_INET;
DestAddr.sin_port = htons ( ulRemotePort );
DestAddr.sin_addr.s_addr = inet_addr( strIP.c_str () );
// z?ro pour le reste de la struct
memset ( &DestAddr.sin_zero, 0 , sizeof ( DestAddr.sin_zero ) );
//Initialisation du socket en TCP
myConnectedSocket = socket ( AF_INET, SOCK_STREAM, IPPROTO_TCP );
//Connexion au serveur distant
int TryToConnect = 0;
int iValue = -1;
//Fait 10 test de connexion en cas d'echec
while ( ( iValue < 0 ) && ( TryToConnect <= 10 ) )
{
//Connexion
iValue = connect ( myConnectedSocket, ( struct sockaddr * ) &DestAddr, sizeof ( struct sockaddr ) );
if ( iValue >= 0 )
{
//Connexion reussi
mybIsConnect = true;
}
TryToConnect ++;
}
//Connexion echouer
if ( iValue < 0 )
{
printf ( "Not connection found\n" );
//Fermeture du socket
close ( myConnectedSocket );
return false;
}
//Connexion reussi
else
{
printf ( "Connexion succes\n" );
//Lancement du Thread d'ecoute de message
if ( myReceiveClientThread == NULL )
{
myReceiveClientThread = ( ReceiveClientThread* ) ( Core::GetInstanceOf ( "myReceiveClientThread", _S_2_ID ( "ReceiveClientThread" ) ) );
myReceiveClientThread->setValue ( "mySocket", myConnectedSocket );
myReceiveClientThread->Init ( );
}
while ( 1 )
{
kstl::string Message;
Message = "test 2.h";
//Recuperation de la taille du message
int MessageLenght = Message.size ( );
send ( myConnectedSocket, Message.c_str ( ), MessageLenght, 0 );
sleep ( 5 );
}
return true;
}
}
}
Char Snipeur
Messages postés
9688
Date d'inscription
vendredi 23 avril 2004
Statut
Contributeur
Dernière intervention
2 octobre 2020
1 328
8 juil. 2010 à 08:12
8 juil. 2010 à 08:12
je vois que tu envoies des chaines de caractères. Il est possible, dans ce cas, que le problème vienne du recv où tu lui dit 200 en réception.
essai d'envoyer comme chaine de caractère ce que tu veux suivi de \r\n peut être que comme ça recv détectera que la chaine est finie et sortira de la boucle.
essai d'envoyer comme chaine de caractère ce que tu veux suivi de \r\n peut être que comme ça recv détectera que la chaine est finie et sortira de la boucle.
Vous n’avez pas trouvé la réponse que vous recherchez ?
Posez votre question
lucichose
Messages postés
39
Date d'inscription
mardi 29 juillet 2008
Statut
Membre
Dernière intervention
7 mars 2012
8 juil. 2010 à 09:21
8 juil. 2010 à 09:21
je vien de tester mais cela ne change rien :(
Cela pourais t'il venir du fait que je n'ai pas de DNS dériere pour effectuer mes test ?
Cela pourais t'il venir du fait que je n'ai pas de DNS dériere pour effectuer mes test ?
Char Snipeur
Messages postés
9688
Date d'inscription
vendredi 23 avril 2004
Statut
Contributeur
Dernière intervention
2 octobre 2020
1 328
8 juil. 2010 à 10:45
8 juil. 2010 à 10:45
je pense que ça n'a rien à voir avec le DNS si tu utilises des adresses IP. Le but d'un DNS est de transformer des noms en adresses (et peut être l'inverse dans certains cas), car les machines travaillent en adresses.
En c++, un caractère de fin de chaine n'est pas "\r\n" (qui est le retour a la ligne made in microsoft), mais "\0".
Char Snipeur
Messages postés
9688
Date d'inscription
vendredi 23 avril 2004
Statut
Contributeur
Dernière intervention
2 octobre 2020
1 328
8 juil. 2010 à 10:52
8 juil. 2010 à 10:52
c'est vrai que ce que je dit est ambigüe. De mémoire, il me semble que recv test les chaines de caractères et s'arrête sur les retours à la ligne. Et les retours à la ligne en réseau, c'est \r\n.
\r\n est plus logique que \n seul, car on ne sais pas forcément comment réagit le terminal, \n veux dire "déplacement du curseur sur la ligne suivante", ce qui n'inclu pas forcément de mettre le curseur en début de ligne. Bref...
Par contre, ton histoire de \0 me donne une autre idée.
La taille du message est récupérée avec size(), il doit donc correspondre au nombre de caractères du message. Peut être qu'en mettant "+1" pour envoyer le \0 ça fonctionnerai.
\r\n est plus logique que \n seul, car on ne sais pas forcément comment réagit le terminal, \n veux dire "déplacement du curseur sur la ligne suivante", ce qui n'inclu pas forcément de mettre le curseur en début de ligne. Bref...
Par contre, ton histoire de \0 me donne une autre idée.
La taille du message est récupérée avec size(), il doit donc correspondre au nombre de caractères du message. Peut être qu'en mettant "+1" pour envoyer le \0 ça fonctionnerai.