Socket, problème à l'écriture. - C - Programmation
Marsh Posté le 01-10-2006 à 17:27:05
domos a écrit : Bonjour,
|
Notre avis c'est que cela ne vient pas de "send" (sauf si rxbuff n'est pas de type "pointeur" ).
Peut-être faudrait le code complet de ton client...
Marsh Posté le 01-10-2006 à 23:47:40
Sve@r a écrit : Notre avis c'est que cela ne vient pas de "send" (sauf si rxbuff n'est pas de type "pointeur" ). |
Effectivement rxbuff n'est de type pointeur.
Voici la routine appelée.
j'envoie une trame de type i2c sur le socket et j'entend une réponse.
Je précise que je ne maitrise pas le C et que j'ai repris des exemples donnés.
Cette routine fonctionne bien sauf dans le cas ou la com est coupée.
Code :
|
j'ai rajouté des "printf" pour suivre le programme et il s'arréte bien au 'send' puisque je n'ai pas la suite.
Et pour répondre à la remarque concernant "les autres retour de send", comment les vérifier puisque send semble planté.
J'ai testé en mettant txbuuf/rxbuff en pointeur mais cela ne marche plus du tout.
Merci de ne pas taper sur la tête
Marsh Posté le 02-10-2006 à 09:44:53
send qui plante, mais bien sur ...
send(device, txbuff, nb + 4
t'es sur que c'est pas tout simplement 5 ?
Marsh Posté le 02-10-2006 à 11:38:33
Taz a écrit : send qui plante, mais bien sur ... |
Non, puisqu'il j'envoie 4 octets en entete plus les nb se trouvant dans buf.
Code :
|
Cela fonctionne trés bien sauf quand le hosts a coupé la connexion.
Marsh Posté le 02-10-2006 à 12:51:34
t'es sur que txbuff est assez grand (à priori non dans certains cas). bon tu regardes le retour de send et c'est tout. ça veut dire quoi 'send plante' ...
Marsh Posté le 02-10-2006 à 13:28:17
Taz a écrit : t'es sur que txbuff est assez grand (à priori non dans certains cas). bon tu regardes le retour de send et c'est tout. ça veut dire quoi 'send plante' ... |
txbuff est largement dimensionné car il n'y qu'une dizaine d'octets en moyenne.
J'aimerais bien regarder le retour de send, le pb, c'est qu''il n'y a pas de retour.
Le "printf" juste avant le "send" s'affiche aprés le programme quitte sans avertissement,
ni d'"erreur de segmentation".
Marsh Posté le 02-10-2006 à 23:30:28
Taz a écrit : et ben tu sors ton débugger. |
Le pb était bien celui indiqué par Sve@r, il faut bien que txbuff soit un pointeur.
Il n'y a plus de plantage lorsque la connexion est coupée.
J'avais déjà testé avec des pointeurs mais cela ne fonctionnait pas car je ne savais pas initialiser une chaine pointeur à ce moment là.
merci pour votre aide
Marsh Posté le 03-10-2006 à 09:31:56
quoi un pointeur ? c'est quoi cette histoire ? tu sais plus comment fonctionne un tableau ou quoi ?
Marsh Posté le 03-10-2006 à 12:36:13
Taz a écrit : quoi un pointeur ? c'est quoi cette histoire ? tu sais plus comment fonctionne un tableau ou quoi ? |
Restons calme, je rappel que je ne suis pas un spécialiste du C.
int send(int s, const void *msg, size_t len, int flags);
D'aprés mes lectures, il y a quand même une difference entre une variable chaine et un pointeur sur une chaine.
En tout cas, 'send' ne plante plus en déclarant un txbuff comme pointeur .
Marsh Posté le 03-10-2006 à 12:59:03
domos a écrit : En tout cas, 'send' ne plante plus en déclarant un txbuff comme pointeur . |
A condition, bien sûr, que ce pointeur soit correctement initialisé.
Marsh Posté le 03-10-2006 à 20:51:09
domos a écrit : |
Oui mais tu es désespérant; Quand tu lis une chose, lis le jusqu'au bout et laisse tomber le mysticisme. Si tu as 't' est tableau de 'n' éléments de type 'T', alors 't' est implicitement convertible en 'T*const' pointant sur le son premier élément.
Mais tu nous dis que send est surchargé pour prendre soit un tableau soit un pointeur en argument, je laisse tomber.
Bref, le problème n'est pas là, mais alors pas du tout.
T'as qu'à faire
char buf[100];
char *p = buf;
send(..., buf, ...);
si t'es pas convaincu ...
Marsh Posté le 03-10-2006 à 22:33:48
domos a écrit : Le pb était bien celui indiqué par Sve@r, il faut bien que txbuff soit un pointeur. |
Pfff... J'avais failli ne pas le dire tellement cela me paraissait évident. C'est comme si j'avais dit que "nbl" devait être un entier ou "device" un descripteur valide...
Taz a écrit : T'as qu'à faire |
Tu veux sans doute dire "send(..., p, ...)" sinon je vois pas pourquoi tu inclus ce "p" dans l'histoire...
Marsh Posté le 03-10-2006 à 22:49:06
mais pour conclure ce thread, je dirais juste : envoie en même ce que tu veux envoyer en même temps. Aggréger les messages pour faire un seul send me paraît de loin la meilleur idée, ce qui permet de minimiser le nombre d'appels systèmes.
Marsh Posté le 04-10-2006 à 09:05:13
Taz a écrit : mais pour conclure ce thread, je dirais juste : envoie en même ce que tu veux envoyer en même temps. Aggréger les messages pour faire un seul send me paraît de loin la meilleur idée, ce qui permet de minimiser le nombre d'appels systèmes. |
Voire même créer une structure destinée à contenir l'ensemble des messages; style
typedef struct { |
Puis tu remplis sbuf.text[0], sbuf.text[1], etc et enfin tu envoies
send(..., &sbuf, sizeof(sbuf), 0)
Marsh Posté le 01-10-2006 à 15:17:13
Bonjour,
Sous Linux, J'ai écris un programme C qui utilise les sockets tcp/ip.
c'est un programme client qui se connecte sur un serveur.
La communication fonctionne trés bien entre le client et le serveur.
Le seul pb est que le serveur coupe la connexion aprés un time-out.
Si mon programme est en dehors de ce timeout, il quitte dés la fonction send() sans message d'erreur.
Extrait:
Mon programme est sensé tourné en continu avec la connexion toujours active.
Je ne sais pas gérer ces déconnexions, je pensais que la fonction send() me retournerais un code < 0 mais ce n'est pas le cas.
Aucune erreur renvoyée ni par le programme ni sur la console du programme.
Votre avis ?
merci