Soucis de socket et connect sous QNX

Résolu
Gui51 Messages postés 18 Date d'inscription mardi 18 janvier 2005 Statut Membre Dernière intervention 1 avril 2005 - 29 mars 2005 à 17:31
Gui51 Messages postés 18 Date d'inscription mardi 18 janvier 2005 Statut Membre Dernière intervention 1 avril 2005 - 1 avril 2005 à 17:34
Bonjour, nous avons un soucis lors d'une connection client sous QNX (UNIX).
Voici le type d'erreur que nous obtenons suite à la compilation...

Pouvez-vous nous aider pour corriger ce problème?
Ci-joint, voici le code que nous avons saisis:

#include <stdio.h>
#include <errno.h>
#include <signal.h>
#include <sys/uio.h>
#include
#include <strings.h>
#include <sys/types.h>
#include
#include <netdb.h>
#include <netinet/in.h>
#include <sys/socket.h>


#define SERVEURNAME "172.0.0.1"


int to_server_socket = -1;


void main ( void )
{
char *server_name = SERVEURNAME;
struct sockaddr_in serverSockAddr;
struct hostent *serverHostEnt;
long hostAddr;
long status;
char buffer[512];


bzero(&serverSockAddr,sizeof(serverSockAddr));
hostAddr = inet_addr(SERVEURNAME);
if ( (long)hostAddr != (long)-1)
bcopy(&hostAddr,&serverSockAddr.sin_addr,sizeof(hostAddr));
else
{
serverHostEnt = gethostbyname(SERVEURNAME);
if (serverHostEnt == NULL)
{
printf("gethost marche pas\n");
exit(0);
}
bcopy(serverHostEnt->h_addr,&serverSockAddr.sin_addr,serverHostEnt->h_length);
}
serverSockAddr.sin_port = htons(30000);
serverSockAddr.sin_family = AF_INET;


/* creation de la socket */
if ( (to_server_socket = socket(AF_INET,SOCK_STREAM,0)) < 0)
{
printf("creation socket client marche pas\n");
exit(0);
}
/* requete de connexion */
if(connect( to_server_socket,
(struct sockaddr *)&serverSockAddr,
sizeof(serverSockAddr)) < 0 )
{
printf("La demande de connection marche pas\n");
exit(0);
}
/* envoie de donnée et reception */
write(to_server_socket,"Toto",4);
read(to_server_socket,buffer,512);
printf(buffer);
/* fermeture de la connection */
shutdown(to_server_socket,2);
close(to_server_socket);
}

Merci pour vos réponses...

5 réponses

cs_lacousine Messages postés 58 Date d'inscription mardi 6 janvier 2004 Statut Membre Dernière intervention 13 juillet 2007
31 mars 2005 à 21:46
Bonjour voici de la documentation. Elle n'a pas été écrite par moi-même, mais par un de mes professeurs. En espérant que tu trouveras une réponse dans ce texte.


<HR>
Les messages


Les messages sont au coeur de Neutrino. Ils ne sont pas seulement utilisés par les applications, mais aussi par les appels système.


Ils sont basés sur le modèle client-serveur.


Point de vue du client

Établissement de la connexion
#include <sys/neutrino.h>
int ConnectAttach(
int nd, // Node Descriptor (descripteur de noeud)
pid_t pid, // Process ID (identificateur de processus)
int chid, // Channel ID (identificateur de canal)
unsigned index, // à zéro pour le moment
int flags // à zéro pour le moment
);


Le serveur auquel le cilent veut se connecter peut ainsi être identifié par le trio unique ND-PID-CHID.


Supposons que le client veut se connecter au processus 135, canal 1, sur le noeud (ordinateur) courant. Nous aurons:

int coid = ConnectAttach( 0, 135, 1, 0, 0 );


La variable nommée ici "coid" pour Connection ID, est un petit entier qui identifie de façon unique la connexion et qui pourra être utilisé pour tous les échanges du client avec le serveur.


Envoi d'un message
#include <sys/neutrino.h>
int MsgSend(
int coid, // Connection ID
const void *smsg, // pointeur sur le message envoyé
int sbytes, // taille du message envoyé
void *rmsg, // pointeur sur la réponse
int rbytes // taille de la réponse
);


Envoyons maintenant un message:

#include <sys/neutrino.h>

char *smsg = "Message du client vers le serveur";
char rmsg[ 200 ]; // tampon pour la réponse
int coid;

// établissement de la connexion
coid = ConnectAttach( 0, 135, 1, 0, 0 );
if( coid == -1 )
{
// traitement de l'erreur
}

// envoi du message
if( MsgSend( coid, smsg, strlen( smsg ) + 1, rmsg, sizeof( rmsg ) ) == -1 )
{
// traitement de l'erreur
}

if( strlen( rmsg ) > 0 )
{
printf( "Réponse = %s\n", rmsg );
}


La valeur de retour de MsgSend est décidée par le serveur.


Dans l'exemple, on suppose que la réponse du serveur est une chaîne ASCIIZ.


Point de vue du serveur

Avant que le client puisse se connecter, le serveur doit créer un canal:

#include <sys/neutrino.h>
int ChannelCreate( unsigned flags ); // flags = 0 pour le moment


La valeur retournée par ChannelCreate est l'identificateur de canal (channel ID).


À la toute fin de son exécution, le serveur détruit le canal:

int ChannelDestroy( int chid );


Au niveau du serveur, le traitement des messages se fait en deux étapes: la réception du message (MsgReceive) et l'envoi de la réponse (MsgReply).

#include <sys/neutrino.h>

int MsgReceive(
int chid,
void *msg,
int nbytes,
struct _msg_info *info
);

int MsgReply(
int rcvid,
int status,
const void *msg,
int nbytes
);


[ajouter figure de relation entre les paramètres]


La fonction MsgReceive appelée par le serveur, tout comme la fonction MsgSend appelée par le client sont bloquantes.


Le code suivant est un exemple de serveur:

#include <sys/neutrino.h>

void server( void )
{
int rcvid; // indique à qui il faut répondre
int chid; // le canal
char message[ 512 ]; // un gros tampon

// création du canal
chid = ChannelCreate( 0 );

// boucle infinie typique d'un serveur
while( 1 )
{
// obtention du message
rcvid = MsgReceive( chid, message, sizeof( message ), NULL );

printf( "Reçu message. Le rcvid est %X\n", rcvid );
printf( "Le message est: %s\n", message );

// on prépare le message (ici on réutilise "message")
strcpy( message, "Ceci est la réponse" );
MsgReply( rcvid, EOK, message, sizeof( message ) );
}
}


[donner exemple complet]


Séquence:


Client,
Serveur,
----

,
ChannelCreate(),
----

ConnectAttach(),
,
----

MsgSend(),
,
----

,
MsgReceive(),
----

,
MsgReply(),
----

ConnectDetach(),
,
----

,
ChannelDestroy()




<HR>
Mieux vaut être blonde et poser des questions que de rester ignorante !!!!
3
cs_aardman Messages postés 1905 Date d'inscription mercredi 22 janvier 2003 Statut Membre Dernière intervention 17 septembre 2012 3
29 mars 2005 à 18:00
Salut,
Ca serait pas plutot 127.0.0.1 l'adresse ?
0
Gui51 Messages postés 18 Date d'inscription mardi 18 janvier 2005 Statut Membre Dernière intervention 1 avril 2005
31 mars 2005 à 10:12
Si c'est exact, il s'agit bien 127.0.0.1 cômme adresse...
L'image vous montrant mon erreur ne marche plus, comment faire
0
Gui51 Messages postés 18 Date d'inscription mardi 18 janvier 2005 Statut Membre Dernière intervention 1 avril 2005
31 mars 2005 à 10:29
Je viens de re essayer avec l'adresse du serveur 127.0.0.1 et ça m'aurait bien étonné que cela puisse fonctionner...

J'espère que vous pourrez me trouver ma panne! :)
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
Gui51 Messages postés 18 Date d'inscription mardi 18 janvier 2005 Statut Membre Dernière intervention 1 avril 2005
1 avril 2005 à 17:34
Ok, je te remercie bien...
0
Rejoignez-nous