begin process at 2012 05 30 17:48:18
  Trouver un code source :
 
dans
 
Accueil > Forum > 

Archive C/C++

 > 

Archives

 > 

Réseau / Internet

 > 

Soucis de socket et connect sous QNX


Derniers messages déposésPoser une question dans le forum ou lancer une discussion

Soucis de socket et connect sous QNX

mardi 29 mars 2005 à 17:31:05 | Soucis de socket et connect sous QNX

Gui51

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 <unistd.h>
#include <strings.h>
#include <sys/types.h>
#include <arpa/inet.h>
#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...

mardi 29 mars 2005 à 18:00:56 | Re : Soucis de socket et connect sous QNX

aardman

Membre Club
Salut,
Ca serait pas plutot 127.0.0.1 l'adresse ?
jeudi 31 mars 2005 à 10:12:30 | Re : Soucis de socket et connect sous QNX

Gui51

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

jeudi 31 mars 2005 à 10:29:08 | Re : Soucis de socket et connect sous QNX

Gui51

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! :)
jeudi 31 mars 2005 à 21:46:48 | Re : Soucis de socket et connect sous QNX

lacousine

Réponse acceptée !

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.

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()

 






Mieux vaut être blonde et poser des questions que de rester ignorante !!!!
vendredi 1 avril 2005 à 17:34:20 | Re : Soucis de socket et connect sous QNX

Gui51

Ok, je te remercie bien...


Cette discussion est classée dans : server, include, socket, to, serversockaddr


Répondre à ce message

Sujets en rapport avec ce message

Client FTP sous QNX (ou bien Unix, Linux) [ par Gui51 ] Bonjour,je voudrais savoir si vous avez une aide à m'apporter concernant cette compilation de code pour le client:#include <stdi Probléme a l'éxécution [ par jerem3000 ] Bonjour Je crée un programme qui permet d'envoyer par email le contenue d'un fichier .txt , il devrait normalement marche car il n'y a pas d'erreur mail avec pièce jointe [ par victorcoasne ] Voilà j'ai trouvé dans une source le code que j'ai un peu modifié pour dev-c++ et je voudrais savoir ce qu'il faut rajoutter pour une pièce jointe.#in client smtp probleme [ par lombredudragon ] Voila j'ai trouver un joli code sur le web. J'ai fait le menage et j'ai supprimer l'interface graphique.Donc mon but final c'est d'envoyer un fichier Envoie de données vers un serveur en langage C [ par esmee ] Bonjour,Besoin d'aide,Débutant en programmation , j'aimerai  modifié ce code ci-dessous qui fonctionne bien :write(to_server_socket,"Momo",15);read(to Erreur de segmentation d'un simple client http sous linux !! [ par nassimatique ] #include #include #include #include #include #include #include #define TAILLE 4096 <b Client serveur [ par fanch314 ] Je que le serveur et le client échange par internet.Le serveur ne voit pas de client connectéEt le buffer du client contient nimporte quoi.En gros ils Problème de connexion Socket [ par qhhu ] Bonjour !En temp normal, je programme en java, mais j'ai voulu essayer le c++parce que je trouve que c'est interessant de connaître plusieurs language [socket et api win]recevoir et envoyer en meme temps [ par shadow1779 ] Bonjour je me suis fais un petit programme irc qui me servira de bot pour auto-op des personne ou d'autre taches diverses, le client aura une boite de pb de compilation (prog utilisant un socket) [ par smook ] boujour a tous bon je vais commencer part bien vous detailler ce qui a detailler : j utilise dev c++ 4.9.9.2 et mon ^programme a pour but d ecouter un


Nos sponsors


Sondage...

CalendriCode

Mai 2012
LMMJVSD
 123456
78910111213
14151617181920
21222324252627
28293031   

Consulter la suite du CalendriCode

A découvrir



 
Développement réalisé par Nicolas SOREL (Nix) avec l'aide de : Cyril DURAND et Emmanuel (EBArtSoft), Merci à Vincent pour ses précieux conseils.
CodeS-SourceS.com© Toute reproduction même partielle est interdite sauf accord écrit du Webmaster
CodeS-SourceS.com© est une marque déposée tous droits réservés

Google Coop CodeS-SourceS Google Coop CodeS-SourceS
Temps d'éxécution de la page : 2,246 sec (4)

Nous contacter | Annoncer sur CodeS-SourceS | Mentions légales