Forum |  HardWare.fr | News | Articles | PC | S'identifier | S'inscrire | Shop Recherche
3000 connectés 

 


 Mot :   Pseudo :  
 
 Page :   1  2
Page Suivante
Auteur Sujet :

[RESOLU] connection socket

n°1531986
aneurysm
Posté le 22-03-2007 à 10:13:42  profilanswer
 

Reprise du message précédent :
Bin dans tout les cas je n'ai pas besoin de tout refaire à zéro étant donné que l'approche "j'ai qu'a send'er sur le port machin" a l'air de fonction en envoie. Je voudrai juste comprendre pourquoi je dois me déconnecter du socket pour qu'il execute la requête.

mood
Publicité
Posté le 22-03-2007 à 10:13:42  profilanswer
 

n°1531994
Taz
bisounours-codeur
Posté le 22-03-2007 à 10:26:20  profilanswer
 

aneurysm a écrit :

Bin dans tout les cas je n'ai pas besoin de tout refaire à zéro étant donné que l'approche "j'ai qu'a send'er sur le port machin" a l'air de fonction en envoie. Je voudrai juste comprendre pourquoi je dois me déconnecter du socket pour qu'il execute la requête.


ça marche tellement bien que t'as pas le résultat de ta requête ...

n°1531997
aneurysm
Posté le 22-03-2007 à 10:28:09  profilanswer
 

Oui mais dans tout les cas j'envoie quand meme bien la requête...
Le problème n'a pas l'air assez grave pour que je recommence tout à zero.

n°1532003
Taz
bisounours-codeur
Posté le 22-03-2007 à 10:38:00  profilanswer
 

aneurysm a écrit :

Oui mais dans tout les cas j'envoie quand meme bien la requête...
Le problème n'a pas l'air assez grave pour que je recommence tout à zero.


et elle s'exécute ? si tu fais un insert il passe ?

n°1532010
aneurysm
Posté le 22-03-2007 à 10:45:13  profilanswer
 

En fait j'envoie la commande "Select * from tab", et elle s'execute bien sur le serveur... une fois que je suis déconnecté...

n°1532012
Taz
bisounours-codeur
Posté le 22-03-2007 à 10:46:11  profilanswer
 

comment tu sais qu'elle s'exécute bien ? essaie un insert

n°1532014
aneurysm
Posté le 22-03-2007 à 10:48:56  profilanswer
 

Je le vois sur le serveur en fait, ca m'affiche le resultat de la requête en dessous.

n°1532335
franceso
Posté le 22-03-2007 à 17:30:55  profilanswer
 

aneurysm a écrit :

En fait j'envoie la commande "Select * from tab", et elle s'execute bien sur le serveur... une fois que je suis déconnecté...


C'est peut-être parce que les données sont bufferisées. Tu utilises un "write" ou un "printf" pour écrire sur ta socket ?


---------------
TriScale innov
n°1532366
Emmanuel D​elahaye
C is a sharp tool
Posté le 22-03-2007 à 18:17:27  profilanswer
 

franceso a écrit :

C'est peut-être parce que les données sont bufferisées. Tu utilises un "write" ou un "printf" pour écrire sur ta socket ?


 [:arrakys]  


---------------
Des infos sur la programmation et le langage C: http://www.bien-programmer.fr Pas de Wi-Fi à la maison : http://www.cpl-france.org/
n°1532414
Sve@r
Posté le 22-03-2007 à 22:02:49  profilanswer
 


C'est vrai qu'écrire sur une socket via un "printf()" c'est un peu "olé olé" comme technique. Pour les amateurs de nouvelles expériences, ça se tente... :D


---------------
Vous ne pouvez pas apporter la prospérité au pauvre en la retirant au riche.
mood
Publicité
Posté le 22-03-2007 à 22:02:49  profilanswer
 

n°1532581
franceso
Posté le 23-03-2007 à 10:49:03  profilanswer
 


Sve@r a écrit :

C'est vrai qu'écrire sur une socket via un "printf()" c'est un peu "olé olé" comme technique. Pour les amateurs de nouvelles expériences, ça se tente... :D


 
C'est fprintf() que je voulais dire :o
 
Et j'ai déjà vu plein de projets d'école d'ingé dans lesquels les élèves écrivaient dans leurs sockets via fprintf (sur un FILE* obtenu avec fdopen). En général, ils obtenaient le même genre de problèmes qu'aneurysm ici. La question valait le coup d'être posée, non ?


---------------
TriScale innov
n°1532775
aneurysm
Posté le 23-03-2007 à 13:44:49  profilanswer
 

nan en fait j'envoie un tableau de chaine de caractère sur le socket :
 
char sendbuf[TM_TCPECHOBUF_CLIENT_SENDSIZE ]="select PrixVente from mon_magasin";
 
et pour envoyer :
retval = send( sd, (char *) sendbuf, sizeof(sendbuf), 0, &error);
 
...Je ne sais pas si j'ai correctement répondu a ta remarque?..

n°1532783
Emmanuel D​elahaye
C is a sharp tool
Posté le 23-03-2007 à 14:05:29  profilanswer
 

aneurysm a écrit :

nan en fait j'envoie un tableau de chaine de caractère sur le socket :

 

char sendbuf[TM_TCPECHOBUF_CLIENT_SENDSIZE ]="select PrixVente from mon_magasin";

 

et pour envoyer :
retval = send( sd, (char *) sendbuf, sizeof(sendbuf), 0, &error);


C'est pas bon. C'est

 
Code :
  1. retval = send (sd, sendbuf, strlen (sendbuf), 0, &error);


Le 0 final appartient au C, pas aux sockets...

 

De plus, le jour où tu as un pointeur et non un tableau, sizeof ne fonctionne plus, alors que strlen() fonctionne toujours sur une chaine C bien formée...

 

Par contre, le protocole SQL exige peut être que la commande soit terminée par CR ou CRLF ou que sais-je encore. Lire la doc de MySQL.

 

Attention à la réception :

 

http://mapage.noos.fr/emdel/reseaux.htm#texte


Message édité par Emmanuel Delahaye le 23-03-2007 à 14:08:25

---------------
Des infos sur la programmation et le langage C: http://www.bien-programmer.fr Pas de Wi-Fi à la maison : http://www.cpl-france.org/
n°1532861
Sve@r
Posté le 23-03-2007 à 15:27:54  profilanswer
 

franceso a écrit :

J'ai déjà vu plein de projets d'école d'ingé dans lesquels les élèves écrivaient dans leurs sockets via fprintf (sur un FILE* obtenu avec fdopen). En général, ils obtenaient le même genre de problèmes qu'aneurysm ici.


Ben la fonction spécialement dédiée à l'envoi de données sur socket c'est send(). Si tu utilises un autre truc, ç'est pas garanti...
fdopen() a pour but de donner un pointeur de type "FILE*" associé à un fichier ouvert préalablement par "open()" afin d'offrir une passerelle entre les deux outils de gestion de fichiers (open/close d'un coté, fopen/fclose de l'autre) qu'on trouve généralement partout. Si quelqu'un utilise fdopen() pour associer un "FILE *" à une socket, faut pas s'étonner que ce quelqu'un ait ensuite des ennuis pour travailler avec ce "FILE *". Faut pas oublier que derrière un FILE *, il y a tout un ensemble d'outils de bufferisation et de gestion que les sockets peuvent ne pas supporter...
Juste pour savoir, dans les projets que t'as vu, ces élèves avaient intégré du fflush() ???

Message cité 1 fois
Message édité par Sve@r le 23-03-2007 à 15:29:18

---------------
Vous ne pouvez pas apporter la prospérité au pauvre en la retirant au riche.
n°1532863
Sve@r
Posté le 23-03-2007 à 15:33:51  profilanswer
 

aneurysm a écrit :

nan en fait j'envoie un tableau de chaine de caractère sur le socket :
 
char sendbuf[TM_TCPECHOBUF_CLIENT_SENDSIZE ]="select PrixVente from mon_magasin";
 
et pour envoyer :
retval = send( sd, (char *) sendbuf, sizeof(sendbuf), 0, &error);


 
Déjà, tu peux remplacer "sizeof(sendbuf)" par "strlen(sendbuf)". C'est totalement inutile d'envoyer sur ta socket plus d'octets que nécessaire. A la limite tu peux y envoyer le '\0' en mettant "strlen(sendbuf) + 1" mais même ça c'est pas obligé => de l'autre coté, tu lis "n" caractères et tu rajoutes le '\0' manuellement là où il faut...
 
[edit] Oups, désolé, Emmanuel l'a déjà dit...
 
Ensuite, as-tu examiné la valeur de "retval" ? Voire celle de "errno" ?? Et que contient "error" en sortie de fonction ???
 
Je reste quand-même très intrigué par cette fonction "send" qui n'est pas la fonction officielle de la libC...


Message édité par Sve@r le 23-03-2007 à 15:36:55

---------------
Vous ne pouvez pas apporter la prospérité au pauvre en la retirant au riche.
n°1532924
franceso
Posté le 23-03-2007 à 16:44:57  profilanswer
 

Sve@r a écrit :

Ben la fonction spécialement dédiée à l'envoi de données sur socket c'est send(). Si tu utilises un autre truc, ç'est pas garanti...

Sur le projet en question, il me semble que j'écrivais directement à coup de write() et ça marchait bien (on n'avait pas vu send() en cours). Après vérification sur la page de man, il semble que la seule différence entre send() et write() soit la possibilité de mettre des flags spéciaux pour les sockets, donc je pense que ce n'était pas une erreur d'utiliser write() plutôt que send() dans mon cas.
 

Sve@r a écrit :

fdopen() a pour but de donner un pointeur de type "FILE*" associé à un fichier ouvert préalablement par "open()" afin d'offrir une passerelle entre les deux outils de gestion de fichiers (open/close d'un coté, fopen/fclose de l'autre) qu'on trouve généralement partout. Si quelqu'un utilise fdopen() pour associer un "FILE *" à une socket, faut pas s'étonner que ce quelqu'un ait ensuite des ennuis pour travailler avec ce "FILE *". Faut pas oublier que derrière un FILE *, il y a tout un ensemble d'outils de bufferisation et de gestion que les sockets peuvent ne pas supporter...

Je sais, c'est pour ca que je leur disais de ne pas s'étonner s'ils avaient des problèmes.
 

Sve@r a écrit :

Juste pour savoir, dans les projets que t'as vu, ces élèves avaient intégré du fflush() ???

Oui, en général, ils mettaient des fflush() partout dès qu'ils se rendaient compte qu'il avait un problème de bufferisation des données à envoyer. D'après ce dont je me souviens (mais ça date quand même d'il y a deux ans), ça marchait pas trop mal (en tous cas au moins sur les systèmes qu'on utilisait ; mais c'est peut-être complètement non portable)
 


---------------
TriScale innov
n°1532981
Sve@r
Posté le 23-03-2007 à 19:45:04  profilanswer
 

franceso a écrit :

Sur le projet en question, il me semble que j'écrivais directement à coup de write() et ça marchait bien (on n'avait pas vu send() en cours). Après vérification sur la page de man, il semble que la seule différence entre send() et write() soit la possibilité de mettre des flags spéciaux pour les sockets, donc je pense que ce n'était pas une erreur d'utiliser write() plutôt que send() dans mon cas.


Exact - read/write sur Unix/Linux sont faites pour tout périphérique IO donc on peut les utiliser sans problème à la place de send/recv...
 

franceso a écrit :

... ça marchait pas trop mal...


Hum... quand on dit "pas trop mal" ça signifie aussi "pas trop bien"...
 

franceso a écrit :

mais c'est peut-être complètement non portable)


peut-être... ;)

Message cité 1 fois
Message édité par Sve@r le 23-03-2007 à 19:47:35

---------------
Vous ne pouvez pas apporter la prospérité au pauvre en la retirant au riche.
n°1533515
aneurysm
Posté le 26-03-2007 à 10:20:04  profilanswer
 

hey en fait j'ai testé la remarque d'emmanuel sur l'envoie de CR en fin de chaine, donc en gros :
"select * from tab1\r";
et hop ca marche  
Il ne me reste plus qu'à rentrer les données recues de la base de donnée dans ma fonction d'envoie sur l'afficheur LCD par i2C et mon projet sera presque fini....
MERCI beaucoup car sans l'aide sur le \r je pense que j'aurai galéré un sacré bout de temps.....

n°1533543
Emmanuel D​elahaye
C is a sharp tool
Posté le 26-03-2007 à 11:05:05  profilanswer
 

aneurysm a écrit :

MERCI beaucoup car sans l'aide sur le \r je pense que j'aurai galéré un sacré bout de temps.....


Bah, je pense qu'il suffit de lire correctement la doc, notamment le protocole SQL...
 


---------------
Des infos sur la programmation et le langage C: http://www.bien-programmer.fr Pas de Wi-Fi à la maison : http://www.cpl-france.org/
n°1533984
franceso
Posté le 27-03-2007 à 09:31:10  profilanswer
 

Sve@r a écrit :

Hum... quand on dit "pas trop mal" ça signifie aussi "pas trop bien"...

Il me semble que certains binômes avaient toujours de problèmes avec ça, mais impossible de dire s'ils avaient simplement oublié un fflush() quelque part, ou bien si l'utilisation de FILE* dans ces cas là posait vraiment un problème. En tous cas, quand ils me posaient la question, je ne cherchais pas trop à comprendre et je leur conseillais d'utiliser read/write directement pour ne pas avoir à s'embêter avec les problèmes de bufferisation.
 


---------------
TriScale innov
n°1534271
Sve@r
Posté le 27-03-2007 à 14:47:20  profilanswer
 

franceso a écrit :

...et je leur conseillais d'utiliser read/write directement pour ne pas avoir à s'embêter avec les problèmes de bufferisation.


Exactement. En fait, j'en suis encore à me demander quels avantages ils avaient à passer via des "FILE *". Pour pouvoir faire du "fprintf()" pour transférer des chaînes formatées de l'autre coté ? Rien que le concept est en lui-même complètement idiot. Si on a besoin d'avoir une chaîne formatée de l'autre coté, ben on envoie juste les valeurs et l'autre coté s'occupe de formater lui-même la chaîne...


---------------
Vous ne pouvez pas apporter la prospérité au pauvre en la retirant au riche.
n°1534415
franceso
Posté le 27-03-2007 à 16:38:24  profilanswer
 

Sve@r a écrit :

Exactement. En fait, j'en suis encore à me demander quels avantages ils avaient à passer via des "FILE *". Pour pouvoir faire du "fprintf()" pour transférer des chaînes formatées de l'autre coté ? Rien que le concept est en lui-même complètement idiot. Si on a besoin d'avoir une chaîne formatée de l'autre coté, ben on envoie juste les valeurs et l'autre coté s'occupe de formater lui-même la chaîne...


En fait, ils faisaient en général du fgets() en lecture (enfin, les meilleurs, parce que la grosse majorité essayait infructueusement de faire du sscanf robuste). Du coup, ça paraissait plus naturel de travailler avec des FILE* des deux côtés.
 
Par ailleurs, le protocole qu'on avait à implémenter était basé sur du texte, donc travailler avec write() impliquait de faire du sprintf() avant pour formater la chaine à transmettre. Curieusement, tout le monde connaît fprintf(), mais très peu connaissent son petit frère sprintf().


---------------
TriScale innov
n°1534419
Emmanuel D​elahaye
C is a sharp tool
Posté le 27-03-2007 à 16:42:49  profilanswer
 

franceso a écrit :

Curieusement, tout le monde connaît fprintf(), mais très peu connaissent son petit frère sprintf().


Oui, j'ai constaté ça aussi très souvent...
 


---------------
Des infos sur la programmation et le langage C: http://www.bien-programmer.fr Pas de Wi-Fi à la maison : http://www.cpl-france.org/
n°1534432
aneurysm
Posté le 27-03-2007 à 16:52:31  profilanswer
 

HELLO
Alors voila, je dois trier les informations contenues dans un tableau de charactère pour pouvoir les envoyer dans plusieurs tableaux, c'est tres mal expliqué alors je vais détailler :
 
J'ai à la base un tableau de charactère :
char resultsql[100];
qui contiendra le resultat d'une requete sur serveur MYSQL.
elle sera de la forme : play|200|0
nom prix rayon
Je dois découper le tableau pour pouvoir mettre les données correspondantes au nom,prix,rayon dans des tableaux :
char tabnom[10];
char tabprix[10];
char tabrayon[10];
 
J'ai realisé une boucle pour effectuer ce découpage mais ca fait carrement nympe
voila la fonction :  
 
if (resultsql[w]!='|')
       {
       while (resultsql[w]!=0x7c)
           {
          tabnom[w]=resultsql[w];
 
          w++;
         }
       }
         for (w=0;w<strlen(resultsql);w++)
       {
       while (resultsql[w]!=0x7c)
           {
          tabprix[w]=resultsql[w];
          w++;
 
         }
       }
 
         for (w=0;w<strlen(resultsql);w++)
       {
       while (resultsql[w]!=0x7c)
           {
          tabrayon[w]=resultsql[w];
          w++;
 
         }
       }
 
merci d'avance

Message cité 2 fois
Message édité par aneurysm le 27-03-2007 à 16:52:55
n°1534435
_darkalt3_
Proctopathe
Posté le 27-03-2007 à 16:58:15  profilanswer
 

[:moule_bite]


---------------
Töp of the plöp
n°1534457
Emmanuel D​elahaye
C is a sharp tool
Posté le 27-03-2007 à 17:18:12  profilanswer
 

aneurysm a écrit :

HELLO
Alors voila, je dois trier les informations contenues dans un tableau de charactère pour pouvoir les envoyer dans plusieurs tableaux, c'est tres mal expliqué alors je vais détailler :
 
J'ai à la base un tableau de charactère :
char resultsql[100];
qui contiendra le resultat d'une requete sur serveur MYSQL.
elle sera de la forme : play|200|0
nom prix rayon
Je dois découper le tableau pour pouvoir mettre les données correspondantes au nom,prix,rayon dans des tableaux :
char tabnom[10];
char tabprix[10];
char tabrayon[10];


Tu peux utiliser strtok() si la chaine est modifiable. Attention, le fonctionnement de strtok() n'est pas garanti en  environnement multi-tâche...


---------------
Des infos sur la programmation et le langage C: http://www.bien-programmer.fr Pas de Wi-Fi à la maison : http://www.cpl-france.org/
n°1534727
aneurysm
Posté le 28-03-2007 à 09:49:13  profilanswer
 

j'ai essayé, ca decompose bien la chaine mais comment on peut faire si on veut mettre les mots dans des tableaux au lieu de les imprimer?
 
BON apparement le beck plante a chaque utilisation d'une boucle while.......... ca restreint pas mal ....

n°1534810
Emmanuel D​elahaye
C is a sharp tool
Posté le 28-03-2007 à 10:56:51  profilanswer
 

aneurysm a écrit :

j'ai essayé, ca decompose bien la chaine mais comment on peut faire si on veut mettre les mots dans des tableaux au lieu de les imprimer?


strcpy() . C'est un scoop ? Tu ne connais pas les bases du C et tu te lances dans un projet pareil ? J'ai du mal à comprendre. Le C, ça s'apprend... C'est pas un langage de bidouilleur.

 
Citation :

BON apparement le beck plante a chaque utilisation d'une boucle while.......... ca restreint pas mal ....


Il y a un bug a la ligne 42...

 



Message édité par Emmanuel Delahaye le 28-03-2007 à 10:57:18

---------------
Des infos sur la programmation et le langage C: http://www.bien-programmer.fr Pas de Wi-Fi à la maison : http://www.cpl-france.org/
n°1534834
aneurysm
Posté le 28-03-2007 à 11:18:05  profilanswer
 

LOL bin ouai y'a pas grand chose a comprendre, je ne connai pas les bases du C et d'ailleurs personne en 2ème année de bts informatique et réseau ne les connait lol (a moins bien sur qu'il en ai fait avant).

n°1534858
Emmanuel D​elahaye
C is a sharp tool
Posté le 28-03-2007 à 11:30:21  profilanswer
 

aneurysm a écrit :

LOL bin ouai y'a pas grand chose a comprendre, je ne connai pas les bases du C et d'ailleurs personne en 2ème année de bts informatique et réseau ne les connait lol (a moins bien sur qu'il en ai fait avant).


Il serait peut être plus sage de commencer par là, non ? Il faut 6 mois à un an pour maitriser les bases... Il y a des références de livres et de tutoriels sur mon site...
 


---------------
Des infos sur la programmation et le langage C: http://www.bien-programmer.fr Pas de Wi-Fi à la maison : http://www.cpl-france.org/
n°1534879
franceso
Posté le 28-03-2007 à 11:42:21  profilanswer
 

aneurysm a écrit :

Je dois découper le tableau pour pouvoir mettre les données correspondantes au nom,prix,rayon dans des tableaux :
char tabnom[10];
char tabprix[10];
char tabrayon[10];


Pourquoi as-tu besoin recopier tes informations, alors que tu disposes déjà d'une grande chaine de caractères bien allouée qui les contient toutes ? En particulier, je suppose que la première chose que tu feras avec tabprix est un strtod() ou équivalent, donc inutile de recopier une chaîne de caractères que tu n'utiliseras plus...


---------------
TriScale innov
n°1535556
aneurysm
Posté le 29-03-2007 à 08:07:32  profilanswer
 

alors pour emmanuel : j'ai a peu pres 4 mois pour mener a bien mon projet bts, la partie programmation fait en gros 1/3 du projet (1/3 réseau et 1/3 base de donnée), il m'était donc techniquement impossible de connaitre les bases en 1 mois et quelques, donc je suis partie un peu a l'arrache.
ensuite pour franceso, j'ai besoin de recopier les informations car je dois envoyer les données dans des buffers distinct pour l'afficheur LCD,  
-j'envoie d'abord la commande effacer LCD et placer curseur en haut
- Ensuite buffer contenant (PRODUIT=)
-buffer contenant la partie de la chaine avec  le nom
-saut de ligne
-buffer contenant (PRIX=)
-buffer contenant la partie de la chaine avec le prix
-buffer contenant le symbole €
-saut de ligne
etc

n°1535635
aneurysm
Posté le 29-03-2007 à 10:28:15  profilanswer
 

C'EST BON J'AI FINI MON PROJET BTS, je suis arrivé a créer la boucle pour recopier les bonnes données dans les chaines prévues, j'affiche bien le nom de l'article, le prix et son rayon sur le LCD, j'ai fait aussi une boucle infinie avec temporisation de 10 min pour mettre a jour automatiquement les données.
merci de votre aide
(je poste mon programme, il est pas super beau a voir mais on sait jamais ca peut etre utile a quelqu'un)

n°1535644
_darkalt3_
Proctopathe
Posté le 29-03-2007 à 10:33:41  profilanswer
 

(tu peux aussi editer ton premier poste et marquer "résolu" dans le titre)


---------------
Töp of the plöp
n°1535663
aneurysm
Posté le 29-03-2007 à 10:57:55  profilanswer
 

 
  Voila voila le fruit de tant de labeur :love: , soyez indulgent je me suis mis au C il y a très peu de temps. :pt1cable:  
  Je vais changer les labels TCP Client done en fonction plus tard, apparement c'est pas mal choquant pour les personnes programmant en C.  
 
 
 
 

Code :
  1. /******************************************************************************
  2. *                                 Inclusion fichiers header
  3. ******************************************************************************/
  4. #include <stdio.h>
  5. #include <string.h>
  6. #include <clib.h>
  7. #include <dos.h>
  8. #include "I2C_API.H"
  9. #include <conio.h>
  10.  
  11.  
  12. /******************************************************************************/
  13. /*                             Declaration des constantes                            */
  14. /*******************************************************************************/
  15.  
  16.  
  17. #define TM_PORT_ECHO                    5100    /* PORT utilisé pour connection*/
  18. #define TM_CLIENTPORT_ECHO              5100   /* PORT utilisé pour connection*/
  19. #define TM_TCPECHOBUF_CLIENT_SENDSIZE    83    /*Longueur maximale requête d'envoie */
  20. #define TM_TCPECHOBUF_CLIENT_RECVSIZE    100   /*Longueur maximale resultat requête en retour*/
  21. #define I2CINT     0xAA
  22. #define TCP_ECHO_CLIENT_DEBUG
  23. #define PRINT_DATA
  24.  
  25. /******************************************************************************/
  26. /*                             Declaration variables globales                        */
  27. /******************************************************************************/
  28. char sendbuf[TM_TCPECHOBUF_CLIENT_SENDSIZE ]="select Produit,PrixVente,Rayon from PrixSouhaite where CodeBarre IN ('123456789')\r"; /*buffer d'envoie*/
  29. char recvbuf[TM_TCPECHOBUF_CLIENT_RECVSIZE ];   /*buffer de reception*/
  30.  
  31. char destIPStr[17];
  32. unsigned long destIPAddr;
  33. char resultsql[100];    //chaine de caractère qui contiendra le resultat de la requête SQL
  34.                                 // il fera la jonction entre les fonctions socket et affichage
  35.  
  36.  
  37. /******************************************************************************/
  38. /*                          Fonction socket()                                 */
  39. /******************************************************************************/
  40.  
  41. void socket()
  42. {
  43.   struct sockaddr_in   addr;
  44.  
  45.   int sd;
  46.   int i;
  47.   int error;
  48.   int retval;
  49.   int j=1;
  50.   BIOS_Set_Focus(FOCUS_APPLICATION);
  51.  
  52.   strcpy(destIPStr,"192.168.0.33" );
  53.  
  54.   printf("\r\nClient:  Dest. IP: %s ,  Port %d\r\n",destIPStr,TM_PORT_ECHO);
  55.   #ifdef TCP_ECHO_CLIENT_DEBUG
  56.   printf("\r\nOuverture socket...\n" );
  57.   #endif
  58.   //API call open socket
  59.   retval = opensocket( SOCK_STREAM, &error );
  60.  
  61.   if(retval == API_ERROR)  /*boucle d'erreur de connection*/
  62.   {
  63.      printf("\r\nOuverture socket echoue: %d", error);
  64.      goto TCP_CLIENT_DONE;
  65.   }
  66.   else
  67.   {
  68.      sd = retval;
  69.   }
  70.  
  71.  
  72.   /**********************************************************************/
  73.   //Connection à l'API, établie la connection au serveur TCP            */
  74.   /**********************************************************************/
  75.   // convertie le port du serveur dans le bon ordre de byte
  76.   addr.sin_family =  PF_INET;
  77.   retval = htons( TM_PORT_ECHO );
  78.   addr.sin_port =  retval;
  79.   //Convertion de l'addresse IP en chaine de charactère
  80.   retval = inet_addr( (char *)destIPStr, &destIPAddr );
  81.  
  82.   if(retval == API_ERROR)
  83.   {
  84.      goto TCP_CLIENT_DONE;
  85.   }
  86.   else
  87.   {
  88.     addr.sin_addr.s_addr =  destIPAddr;
  89.   }
  90.  
  91.   //appel de la fonction connection
  92.   retval = connect( sd, (const struct sockaddr *)&addr, &error );
  93.  
  94.   if(retval == API_ERROR)  /*boucle d'erreur connection socket */
  95.   {
  96.     if(error==261)  //connection refused from server host
  97.     {
  98.      printf("\r\nConnection refusee depuis %s",destIPStr);
  99.     }
  100.     else
  101.     {
  102.        printf("\r\nConnection socket échouee: %d",error);
  103.     }
  104.      goto TCP_CLIENT_DONE;
  105.   }
  106.  
  107.   printf("\r\nConnecte avec %s\r\n",destIPStr);
  108.  
  109.   while(j=1)   //loop forever
  110.   {
  111.          /**************************************************************/
  112.          /*         Envoie des données sur le serveur                  */
  113.          /**************************************************************/
  114.  
  115.        //send
  116.         retval = send( sd,sendbuf, strlen (sendbuf), 0, &error);
  117.  
  118.         if(retval == API_ERROR)
  119.         {
  120.             #ifdef TCP_ECHO_CLIENT_DEBUG
  121.              printf("\r\nTCPClient: Senderror %d",error);
  122.             #endif
  123.          goto TCP_CLIENT_DONE;
  124.  
  125.       }
  126.  
  127.        #ifdef PRINT_DATA
  128.          printf("\r\nTCPClient:\r\nSending :\r\n" );
  129.          for(i=0;i<strlen (sendbuf);i++)
  130.          {
  131.              printf("%c",(char)sendbuf[i]);
  132.  
  133.          }
  134.        #endif
  135.  
  136.          /*****************************************************************/
  137.          /*                   Attente de 1 seconde                        */
  138.          /*****************************************************************/
  139.       api_sleep(100);
  140.  
  141.  
  142.          /*******************************************************************/
  143.          /* Attend la reponse du serveur et appel la fonction de reception  */
  144.       /*******************************************************************/
  145.      
  146.          do
  147.          {
  148.  
  149.                //recv
  150.             retval = recv( sd, recvbuf,TM_TCPECHOBUF_CLIENT_RECVSIZE,
  151.                            MSG_TIMEOUT, 10000L, &error );
  152.  
  153.                if(retval == API_ERROR)
  154.                {
  155.                   #ifdef TCP_ECHO_CLIENT_DEBUG
  156.                    printf("\r\nTCPclient: Recverror %d",error);
  157.                   #endif
  158.            
  159.                }
  160.                else
  161.                {
  162.                   if( retval > 0)    //data received
  163.                   {
  164.                #ifdef PRINT_DATA
  165.                        printf("\r\nTCPClient\r\nReceived:\r\n" );
  166.                       for(i=0;i<retval;i++)
  167.                         {
  168.                           printf("%c",(char)recvbuf[i]);
  169.                      resultsql[i]=recvbuf[i];
  170.                         }//for(i=0;i<outregs.x.ax;i++)
  171.                #endif
  172.              }
  173.              else
  174.              {
  175.                #ifdef TCP_ECHO_CLIENT_DEBUG
  176.                     printf("\r\nTCPclient: Nothing received" );
  177.                     #endif
  178.              }
  179.               }//elseif(retval == API_ERROR)
  180.               /*****************************************************************/
  181.               //Check, if there is more data available at the socket ?
  182.               /*****************************************************************/
  183.                 retval = GetWaitingBytes( sd, &error );
  184.  
  185.        api_sleep(100);
  186.  
  187.      }//Tant que des données sont disponibles
  188.  
  189.        while((retval != API_ERROR && retval > 0) );
  190.  
  191.   }//while(1)   //BOUCLE INFINIE
  192.  
  193.   /*************************************************************/
  194.   /* La fermeture de la connection ne devrait pas avoir lieu,  */
  195.   /* si il s'est bien connecté                                 */
  196.   /*************************************************************/
  197.  
  198.  
  199. TCP_CLIENT_DONE:
  200.   //close socket
  201.   printf("\r\nConnection fermee \r\n" );
  202.   retval = closesocket( sd, &error );
  203.  
  204.   #ifdef TCP_ECHO_CLIENT_DEBUG
  205.   if(retval==API_ERROR)
  206.   {
  207.       printf("\r\nFermeture socket échouee: %d",error);
  208.   }
  209.   #endif
  210.  
  211. }
  212.  
  213.  
  214. /******************************************************************************/
  215. /* Declarations de fonctions pour fonction affichage()                        */
  216. /* Fonction i2C_init (void) -> initialise le bus I2C                          */
  217. /* Fonction I2C_scan -> scan le bus I2C à la recherche des @ des composants   */
  218. /******************************************************************************/
  219.  
  220. void I2C_init (void)     /*initialisation bus i2c+ fixation DATA et CLOCK sur PIN1 et PIN0*/
  221. {
  222.  union  REGS  inregs;      //registre servant à passer les parametres NOYAU>APP
  223.  union  REGS  outregs;     //registre servant à passer les parametres APP>NOYAU
  224.  
  225.  
  226.  inregs.h.ah = 0x80;
  227.  
  228.  int86(I2CINT,&inregs,&outregs);
  229.  
  230. }
  231.  
  232. unsigned char I2C_scan (unsigned char start_addr, unsigned char end_addr)
  233. {
  234. union  REGS  inregs;     //registre servant à passer les parametres APP>NOYAU
  235. union  REGS  outregs;    //registre servant à passer les parametres NOYAU>APP
  236.  
  237.  
  238. inregs.h.ah = 0x81;                  // scan des péripheriques en sortie
  239. inregs.h.al = start_addr;            // du bus i2c et retour  de l'adresse
  240. inregs.h.cl = end_addr;              // dans une variable
  241. int86(I2CINT,&inregs,&outregs);
  242.  
  243. return outregs.h.al;
  244.  
  245. }
  246.  
  247.  int I2C_transmit_block (unsigned char slave,const char far * buffer, int length)
  248. {
  249.     union  REGS  inregs;                  // Transmission d'un bloc de donnée
  250.     union  REGS  outregs;                 //contenue dans le buffer a l'adresse trouvé
  251.     struct SREGS sregs;                   //pendant le scan. retourne charactere a si
  252.                                       //le message est bien transmis
  253.     inregs.h.ah = 0x83;
  254.     inregs.h.al = slave & 0xFE;
  255.     inregs.x.cx = length;
  256.     sregs.es    = FP_SEG(buffer);
  257.     inregs.x.bx = FP_OFF(buffer);
  258.     int86x(I2CINT,&inregs,&outregs,&sregs);
  259.  
  260.         if (outregs.x.flags & 0x01)
  261.      {
  262.           return outregs.h.al;
  263.      }
  264.    printf("le buffer est compose de  : %s\n",buffer);
  265. return 'a';
  266. }
  267.  
  268.     int I2C_transmit_char (unsigned char slave, char c)
  269. {
  270.     union  REGS  inregs;    //registre servant à passer les parametres APP>NOYAU
  271.     union  REGS  outregs;   //registres servant à recevoir les parametres NOYAU>APP
  272.     inregs.h.ah = 0x82;      //n° du service
  273.     inregs.h.al = slave & 0xFE;         //adresse de l’esclave I2C
  274.     inregs.h.cl = c;             //valeur à ecrire
  275.     int86(I2CINT,&inregs,&outregs); //n° IT et passage/récupération des paramètres
  276.      if (outregs.x.flags & 0x01)
  277.    {
  278.        return (int)outregs.h.al & 0x00FF; //récuperation du code d’erreur éventuel
  279.    }
  280.    return c;
  281.  
  282. }
  283.  
  284.  
  285. /*******************************************************************/
  286. /*                         Fonction affichage                                      */
  287. /*******************************************************************/
  288.  
  289. void affichage (void)
  290. {
  291.         char    *separateur = { "|" };     // Le séparateur
  292.      char     *buffer;     //buffer qui contiendra le resultat de la requete
  293.      char *pointeur;
  294.         char z;
  295.      int w=0,y,a,x;
  296.      char *tabnom;     //tableau nom qui sera envoyé par i2C a l'afficheur
  297.      char *tabprix;    //tableau prix qui sera envoyé par i2C a l'afficheur
  298.      char *tabrayon;   //tableau rayon qui sera envoyé par i2C a l'afficheur
  299.         unsigned char  clearscreen[1]={12};   //efface l'écran et place le curseur
  300.      unsigned char  nom[9]={'A','R','T','I','C','L','E','=',' '};
  301.      unsigned char  sautligne[1]={13};    //saut de ligne
  302.      unsigned char  symbeuro[10]={27,128,135,136,158,144,158,136,135,128}; //construction symbole €
  303.      unsigned char  appeleuro[1]={128};  //appel symbole euro de la case memoire 128
  304.      unsigned char  prix[9]={'P','R','I','X',' ',' ',' ','=',' '};
  305.      unsigned char  rayon[9]={'R','A','Y','O','N',' ',' ','=',' '};
  306.         unsigned char  hidecursor[1]={4};  //cache le curseur
  307.      buffer = strdup ( resultsql );
  308.  
  309.      /********************************************/
  310.      /* Initialisation I2C                       */
  311.      /********************************************/
  312.  
  313.      I2C_init();
  314.  
  315.        /********************************************/
  316.      /* Scan bus I2C ->reception adresse esclave */
  317.      /********************************************/
  318.  
  319.      z=I2C_scan(0x00,0xFF);
  320.      printf("l'adresse slave est: %c\n",z);
  321.  
  322.      /*******************************************************************/
  323.      /* Decomposition resultat requete en 3 éléments, nom,prix et rayon */
  324.      /*******************************************************************/
  325.  
  326.      if (buffer !=NULL)
  327.      {
  328.             tabnom = strtok( buffer, separateur  );
  329.          }
  330.  
  331.          if( buffer != NULL )
  332.         {
  333.             // Cherche les autres separateur
  334.             tabprix = strtok( NULL, separateur  );
  335.             tabrayon= strtok( NULL, separateur  );
  336.         }
  337.  
  338.  
  339.        printf("resultat boucle nom : %s\n",tabnom);
  340.        printf("resultat boucle prix : %s\n",tabprix);
  341.        printf("resultat boucle rayon : %s\n",tabrayon);
  342.  
  343.       /*******************************************************************/
  344.       /* Envoie des données sur l'afficheur esclave par bus I2C          */
  345.       /*******************************************************************/
  346.  
  347.      I2C_transmit_block (z,clearscreen,1);
  348.      I2C_transmit_block (z,clearscreen,1);
  349.      I2C_transmit_block (z,nom,9);
  350.      I2C_transmit_block (z,tabnom,strlen(tabnom));
  351.      I2C_transmit_block (z,sautligne,1);
  352.      I2C_transmit_block (z,prix,9);
  353.         I2C_transmit_block (z,tabprix,strlen(tabprix));
  354.      I2C_transmit_block (z,symbeuro,10);
  355.      I2C_transmit_block (z,appeleuro,1);
  356.      I2C_transmit_block (z,sautligne,1);
  357.         I2C_transmit_block (z,rayon,9);
  358.      I2C_transmit_block (z,tabrayon,strlen(tabrayon));
  359.      I2C_transmit_block (z,hidecursor,1);
  360.  
  361. }
  362.  
  363.  
  364.  
  365.  
  366. /****************************************************************/
  367. /* Fonction main()                                              */
  368. /****************************************************************/
  369.  
  370. int main(void)
  371. {
  372.   printf("debut du programme" );
  373.  
  374.   while(1)  //boucle infinie -> mise a jour
  375.   {
  376.   socket();          //appel fonction socket
  377.   api_sleep(100);    //temporisation pour bon retour de resultat de la requête
  378.   affichage();       //appel fonction affichage
  379.   api_sleep(10000);  //temporisation suivant temps entre mise a jour
  380.   }
  381.   printf("fin du programme" );  //ne doit pas apparaitre sauf erreur
  382.   return 0;
  383. }


---------------
Le train de tes injures roule sur les rails de mon indifférence, je préfère partir plutôt que d'entendre ça, plutôt que d'être sourd
mood
Publicité
Posté le   profilanswer
 

 Page :   1  2
Page Suivante

Aller à :
Ajouter une réponse
 

Sujets relatifs
[Résolu] Gros problème de cache[résolu] Variables dynamiques dans des classes
[javascript][résolu] charger une nouvelle page avec window.onloadVBA access execution de macro [résolu]
[Résolu] [Divers] crash d'un programme (Newsleecher)[Résolu] Remplacement d'une chaine par <BR/>
[résolu] pbm session[Résolu] .htaccess chez Free...
warnings: listes chainée [résolu]Batch connection à nas
Plus de sujets relatifs à : [RESOLU] connection socket


Copyright © 1997-2025 Groupe LDLC (Signaler un contenu illicite / Données personnelles)