Soucis de socket et connect sous QNX [Résolu]

Messages postés
18
Date d'inscription
mardi 18 janvier 2005
Dernière intervention
1 avril 2005
- - Dernière réponse : Gui51
Messages postés
18
Date d'inscription
mardi 18 janvier 2005
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...
Afficher la suite 

Votre réponse

5 réponses

Meilleure réponse
Messages postés
58
Date d'inscription
mardi 6 janvier 2004
Dernière intervention
13 juillet 2007
3
Merci
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 !!!!

Dire « Merci » 3

Quelques mots de remerciements seront grandement appréciés. Ajouter un commentaire

Codes Sources a aidé 98 internautes ce mois-ci

Commenter la réponse de cs_lacousine
Messages postés
1905
Date d'inscription
mercredi 22 janvier 2003
Dernière intervention
17 septembre 2012
0
Merci
Salut,
Ca serait pas plutot 127.0.0.1 l'adresse ?
Commenter la réponse de cs_aardman
Messages postés
18
Date d'inscription
mardi 18 janvier 2005
Dernière intervention
1 avril 2005
0
Merci
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
Commenter la réponse de Gui51
Messages postés
18
Date d'inscription
mardi 18 janvier 2005
Dernière intervention
1 avril 2005
0
Merci
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! :)
Commenter la réponse de Gui51
Messages postés
18
Date d'inscription
mardi 18 janvier 2005
Dernière intervention
1 avril 2005
0
Merci
Ok, je te remercie bien...
Commenter la réponse de Gui51

Vous n'êtes pas encore membre ?

inscrivez-vous, c'est gratuit et ça prend moins d'une minute !

Les membres obtiennent plus de réponses que les utilisateurs anonymes.

Le fait d'être membre vous permet d'avoir un suivi détaillé de vos demandes et codes sources.

Le fait d'être membre vous permet d'avoir des options supplémentaires.