les socket - C++ - Programmation
Marsh Posté le 12-11-2004 à 19:47:36
Ca bloque ou ca plante ?
Marsh Posté le 12-11-2004 à 20:10:56
ca bloque,
Voila j'ai refait et y de passe ca:
je me connecte au serveur OK
le serveur m'envoie un truc
ca l'affiche Ok
J'essye d'envoyer un truc au serveur
ca bloque
ni le serveur ni le client ne recoivent rien
et je ne voit rien apparraitre quand je tape dans la fenetre de l'un ou de l'autre
voila les codes
LE SERVEUR
Code :
|
LE CLIENT
Code :
|
Marsh Posté le 12-11-2004 à 22:14:14
logiquement si tu lance le serveur, puis le client, ils attendent chacun que l'autre envoit qq chose, donc forcement ils peuvent attendre longtemps ...
d'autre part une fois tu utilises ta fonction strfill, une fois memset ... pourtant leur role est le meme non ?
Marsh Posté le 13-11-2004 à 11:12:04
Merci pour l'info BlackGodess
memset je ne savais pas que ca existait (je debute)
le serveur est un code que j'ai trouvé sur le net et un peu arrangé
tandis que le client est de moi voila tout
Donc les fonction bloquent tant qu'elle not pas recu quelque chose
comment y pallier?
j'ai entendu parler de select() mais je ne sais pas vraiment en quoi ca consiste
avez vous un solution??
Marsh Posté le 13-11-2004 à 12:34:29
Tu trouveras ce que tu cherches ici :
ftp://ftp1.instit-st-jo.asso.fr/pub/public/CSEcho/
Et pour le serveur en version select(), je l'ai également fait récemment mais ça serait bien que tu comprennes un peu ce que tu fais.
Tu fais quelles études ? BTS IRIS ?
Marsh Posté le 13-11-2004 à 13:21:45
merci pour le lien Maste_Jul
il a l'air long et compliqué mais si il marche alors c'est parfait
je vais le regarder....
PS: Si tu veux le savoir je suis en premiere voila
Vous allez dire que je commence a etre enervant avec mes sockets foireux mais j'ai encore un question
au debut je voulais faire un client genre telnet pour envoyer des mails
comme il ne marchait pas j'ai regardé pk avec le serveur et je me suis retrouvé avec un autre erreur logique celle ci
je suis revenu sur mon client mail et je'ai resolu la moitié du probleme
pour envoyer une chaine au serveur il faut qu'elle soit terminé par \r\n et pas \0 comme les strings normales
apres avoir corrigé ca mon client va un peu plus loin dans la trnsaction puis bloque ....
ca en devient stressant
voila le code:
Code :
|
Qu'ai je donc fait de mal
Marsh Posté le 13-11-2004 à 13:27:27
utiliser des noms en str<machin> qui sont réservés.
strfill étant memset
et strend étant strlen(), et d'ailleurs, tu te plante dans l'index, overflow après
'\r\n' <- caractère multioctet, c'est pas bon.
fait un simple strcat(s, "\r\n" );
utilise fgets et pas gets
à propos de to strfill ou de memset
t'as juste à déclarer ton buffer dans ton for, et de l'initialiser = "" et hop, il est tout plein de zéro
Marsh Posté le 13-11-2004 à 13:28:21
PRECISION:
le code bloque quand j'essaye d'envoyer
mail from: blblblblb@free.fr
ou alors j'obtient parfois un message
555 error qui n'est pas dans le rfc sur smtp
sino tou va bien avant
je me connect()
250 OK postfix gnagnagna
je midentifie
helo bigfotttttt
250 OK
puis soudain
mail from: blablabla
PLUS RIEN OU ERROR 555
Marsh Posté le 13-11-2004 à 14:20:52
oui, tout programme marche bien jusqu'a ce qu'il plante...
Grace a l'aide de taz et des autres le client est presque parfait
il n'y a qu'un hic
on ne peut pas envoyer de messages avec
en effet tout se passe tres bien jusqu'a ce qu'on tape le corps du message
la tout se complique et le serveur semble bouder le client
la seule chose que je sois arrivé a faire c'est d'envoyer un mail qui ne qit absoluùment rien c'est a dire completement vide
Encore un fois je fais appel a votre immense generosité
ce client c'est ma vie....
Apres amelioration par Taz
Code :
|
PS TAZ fgets je sais pas comment ca marche c tout
sinon j'ai pas tout suivi dans tes explications mais voila a quoi j'ai abouti
Marsh Posté le 13-11-2004 à 14:28:37
fgets(buffer, sizeof buffer, stdin);
printf("%s\n", &buffer);
arghhhhhhhhhhhhhhhh -> puts(buffer);
Marsh Posté le 13-11-2004 à 14:42:00
Cher Taz
pourrais tu etre plus explicite
j'ai fais
fgets(buffer,sizeof(buffer,stdin))
maintenant j'ai deux fois chaque messages de la part du serveur
autre point
que signifie
arghhhhhh-> puts buffer
puisque t'es toujours la tu me disais quoi avec overflow, mauvais index...
tout a l'heure
merci
je suis peut etre un peu enququinanant
en tout cas merci pour tes conseils qui jusque ici m'ont ete tres utiles
c'est a peu pres tout
Marsh Posté le 13-11-2004 à 14:49:03
je t'explique : d'une part t'es bigleux, et d'autre par ton compilateur est une merde sans nom s'il ne t'avertit pas des conneries que tu fais.
la solution, c'est relire mon précédent poste, et d'arrêter de faire le con avec les parenthèses
Marsh Posté le 13-11-2004 à 14:54:50
je m'a trompé en tapant,
j'ai fait
fgets(buffer, sizeof(buffer), stdin);
ca marche po^
comme je dis ca fait deux trucs a la reception
Marsh Posté le 13-11-2004 à 14:56:58
je crois que j'ai compris le arrgg cetait pour les parentheses oubliées a sizeof(buffer)
Ps ca fait quand meme deux fois le meme message
KEEP COOL
Marsh Posté le 13-11-2004 à 16:34:31
maerlin666 a écrit : oui, tout programme marche bien jusqu'a ce qu'il plante... |
En dehors des problèmes liés au code il faudrait s'assurer que tu respectes bien les RFC pour le corps du message. Tu pourrais nous montrer ce que tu envoies au serveur histoire de voir si le problème se situe au niveau de l'envoi des données ou si ce sont les donées elle même qui posent problème...
Marsh Posté le 13-11-2004 à 19:11:31
j'envoie des lettres au serveur...
Ex:
Salut,
c'est moi
.
malheuresement ca bloque apres Salut,
le programmae a l'air de fonctionner puisqu'il envoie parfaitement les commandes
mais pour envoyer le corps du message
ah
j'ai compris je suis con
comme l'a dit Black Godess
c'est mon recv() qui bloque puisque le serveur ne renvoie rien apres des phrases
contrairement a apres des commandes
bon ben désolé pour tout ce tralala
et merci a tout ceux qui ont répondu
PS: TAZ m'en veux pas si j'ai posé trop de questions :sans rancune?
Marsh Posté le 13-11-2004 à 20:12:03
Apres moult' zefforts vous etiez tous impatient de savoir si il s'etait passé
quelque chose
En verité je vous le dis ce programme marche et j'en suis fier (mon premier programme sans gros mot et qui mache)
merci pour votre aide a tous et a la patience de Taz
pour ceux que ca interesse voila le code
Bien su qu'evidemment il doit etre un peu grossier pour vous
dites moi dans ce cas comment je puis l'arranger pour le rendre plus elegant merci
Code :
|
#include <winsock2.h>
#include <stdio.h>
#include <string.h>
#include <conio.h>
#pragma comment (lib, "ws2_32.lib" )
void main()
{
WSADATA WSAData;
WSAStartup(MAKEWORD(2 ,0), &WSAData);
SOCKET my_sock;
SOCKADDR_IN remote_sin;
SOCKADDR_IN my_sin;
char buffer[256];
my_sock = socket(AF_INET, SOCK_STREAM, 0);
/*Leur SOCKADDR*/
remote_sin.sin_family = AF_INET;
remote_sin.sin_addr.s_addr = inet_addr("213.228.0.62" );
remote_sin.sin_port = htons(25);
printf("-=[CLIENT]=-\n" );
connect(my_sock, (SOCKADDR *)&remote_sin, sizeof(SOCKADDR));
while(1)
{
int i = recv(my_sock, buffer, sizeof(buffer), 0);
buffer[i]='\0';
printf("%s\n", &buffer);
gets(buffer);
strcat(buffer,"\r\n" );
if(buffer[0]=='s')
break;
send(my_sock, buffer, strlen(buffer), 0);
}
while(1)
{
send(my_sock, buffer, strlen(buffer), 0);
gets(buffer);
strcat(buffer,"\r\n" );
if(buffer[0]=='.')
{
buffer[1]='\0';
break;
}
}
strcat(buffer, "\r\n" );
send(my_sock, buffer, strlen(buffer), 0);
int i = recv(my_sock, buffer, sizeof(buffer), 0);
buffer[i]='\0';
printf("%s\n", buffer);
printf("QUIT" );
send(my_sock, "QUIT\n", strlen(buffer), 0);
system("pause" );
}
Marsh Posté le 13-11-2004 à 20:15:26
Comment t'envoies un "mail" avec ça ?
Marsh Posté le 13-11-2004 à 20:15:30
tu ferais mieux de faire char buffer[1024 * 1024] parce que sinon, on c'est jamais ce qui peut se passer si on rentre trop de caractères avec ton gets
Marsh Posté le 13-11-2004 à 23:03:08
y parait que le prog ne marche pas sur d'autres ordi
d'ou ca peut venir ?
il marche chez vous
????
Marsh Posté le 14-11-2004 à 10:43:28
Ca veut dire quoi ça ne marche pas? Le programme ne se lance pas? Il n'arrive pas à se connecter au serveur messagerie?
Il est possible (voire même très probable) que le serveur SMTP que tu indiques en dur dans ton programme refuse l'accès aux abonnés autres que Free.
Marsh Posté le 14-11-2004 à 13:29:34
oui c sa il refuse la connection !
y a t il un serveur qui accepte t le monde et qui soit anonyme?
Marsh Posté le 14-11-2004 à 13:31:47
crée le toi même
Attention à la dérive, ça commence à ressembler à du spamming
Marsh Posté le 14-11-2004 à 15:35:06
maerlin666 a écrit : oui c sa il refuse la connection ! |
Le plus simple si c'est pour envoyer des mails par un serveur SMTP ce serait que ton programme prenne en argument le nom d'un serveur, comme ça chaque personne qui voudrait lancer ton programme rajouterait en argument le serveur SMTP de son provider: programme.exe smtp.free.fr
Par contre comme le signal Taz attention de ne pas tomber dans le spamming, c'est mal
Marsh Posté le 19-11-2004 à 18:38:08
suivant vos bon conseil j'essaye de rajouter un gethostbyname a mon client mais je me heurte a des difficultés imprevues
J'ai fait
hostent* h;
h = gethostbyname("smtp.free.fr" );
r_sin.sin_addr = h->h_addr;
mais pouet ca marche pas
il faut convertir en u long (si j'ai bien compris le compilateur)
J'ai quelques questions:
c'est quoi cette struct hostent*
j'ai pas trop compris de quoi elle etait faite
les ** c'est des tableauX? aplusieurs dimension?
h__addr pk c'est du char*?
Marsh Posté le 12-11-2004 à 17:34:11
salut je suis nouveau et c'est mon premier post
je debute en c/c++ et je m'essaye a un programme utilisant les socket
évidemment il ne marche pas et bien sûr je ne comprend pas pourquoi
c'est la raison tres originale pour laquelle je fais ce post
Voila le code
Merci d'avance pour votre aide
Petite precision:
le code bloc au niveau du send et ne passe jamais a la ligne suivante
koi kil se passe?????
[cpp]
#include <winsock2.h>
#include <stdio.h>
#include <string.h>
#include <conio.h>
#pragma comment (lib, "ws2_32.lib" )
void strfill(char *buf, int size, char lettre)
{
for(int i=0; i<=size; i++)
buf[i]=lettre;
}
void main()
{
WSADATA WSAData;
WSAStartup(MAKEWORD(2 ,0), &WSAData);
SOCKET my_sock;
SOCKADDR_IN remote_sin;
char buffer[256];
my_sock = socket(AF_INET, SOCK_STREAM, 0);
remote_sin.sin_family = AF_INET;
remote_sin.sin_addr.s_addr = inet_addr("213.228.0.62" );
remote_sin.sin_port = htons(25);
connect(my_sock, (SOCKADDR *)&remote_sin, sizeof(SOCKADDR));
while(1)
{
strfill(buffer, sizeof(buffer),'\0');
recv(my_sock, buffer, sizeof(buffer), 0);
printf("%s", &buffer);
gets(buffer);
/*C'est maintenant que ca bloque*/
int sent = send(my_sock, buffer, strlen(buffer), 0);
if(sent==-1)
printf("Erreur \"send\" n'as pas fonctionné" );
}
system("pause" );
}