PDA

Voir la version complète : [PSP][Aide] Mes p'tit sockets [résolu]


spyk
13/07/2006, 17h19
Bonjour a tous!
Me revoici pour ma question de la semaine ;)
Donc bon, comme vous avez pus le voir précèdement, j'arrive maintenant a activer le wifi avec oslib ;)
Cependant, j'ai encore quelques probleme de socket.
Alors, le programme qui va suivre fait les chose suivantes :
-Connection au wifi
-Reception du message d'acceuille du server avec recv()
-Envoie d'un message avec send()
-Reception de la reponse avec recv

//Port et maxdatasize
#define PORT 3030 /* Le port où le client se connectera */
#define MAXDATASIZE 300 /* Tampon d'entrée */

//***
//Definition des pointeurs vers nos images
//***
OSL_IMAGE *fond;

void start_client()
{
int sockfd, numbytes, sentbytes;
char *buf[MAXDATASIZE];
char *msg;
struct hostent *he;
struct sockaddr_in their_addr; /* Adresse de celui qui se connecte */

if ((he=gethostbyname("192.168.0.1")) == NULL)
{ /* Info de l'hôte */
oslPrintf("erreur avec gethostbyname\n");

}

//Création du socket
if ((sockfd = socket(AF_INET, SOCK_STREAM, 0)) == -1)
{
oslPrintf("error creating socket\n");
}
//Définition du socket
their_addr.sin_family = AF_INET; /* host byte order */
their_addr.sin_port = htons(PORT); /* short, network byte order */
their_addr.sin_addr = *((struct in_addr *)he->h_addr);
bzero(&(their_addr.sin_zero), 8); /* zero pour le reste de struct */

//Connection du socket
oslPrintf("Connection au PC \n");
if (connect(sockfd, (struct sockaddr *)&their_addr, sizeof(struct sockaddr)) == -1)
{
oslPrintf("error connecting socket\n");
}



oslPrintf("Reception de la chaine de texte\n");
if ((numbytes=recv(sockfd, buf, MAXDATASIZE, 0)) == -1)
{
oslPrintf("error recv()\n");
}
buf[numbytes] = '\0';
oslPrintf("Recu: %s\n",buf);



oslPrintf("Boucle, appuyé sur bas, haut, ou start pour quitter\n");
// oslEndDrawing();

while (!osl_quit)
{
oslWaitKey();
oslReadKeys();

if (osl_keys->held.down)
{
oslPrintf("Envoie du msg...\n");

msg = "Hello World!";
if ( send(sockfd, msg, strlen(msg), 0) == -1)
{
oslPrintf("Erreur avec send()");
}
oslPrintf("Bytes envoyées!\n");

}
if (osl_keys->held.up) oslPrintf("Vous appuyez Haut\n");
if (osl_keys->held.left) oslPrintf("Vous appuyez Gauche\n");
if (osl_keys->held.right) oslPrintf("Vous appuyez Droite\n");
if (osl_keys->held.start) break;
/*
//Affichage de la reception du server
if ((numbytes=recv(sockfd, buf, MAXDATASIZE, 0)) == -1)
{
oslPrintf("error recv()\n");
}
buf[numbytes] = '\0';

oslPrintf("Recu: %s\n",buf);
*/
}




//Fermeture du socket
close(sockfd);
}

(J'ai laissé que la fonction qui nous interesse, j'ai enlevé le reste du programme, qui active le wifi et tout le blabla...)

Donc voici le probleme:
Je peux recevoire le message d'acceuille avec recv, pas de probleme, mais si jamais je tente de recevoire quelque chose, alors que le server n'a rien a dire, la PSP plante...
2e Probleme, bien qu'aucun message d'erreur ne s'affiche, le fonction send()
N'envoie rien...
Et si on veux compter les bytes envoyés avec
sentbytes = send(socket, message, taille,0)
La PSP plante...

J'espere que quelqun auras une solution...

Merci encore a vous tous !

Smealum
13/07/2006, 17h29
Pour ton deuxième problème, je crois savoir d'où vient le problème :
Tu as msg qui ets un pointeur char, mais tu n'as pas le droite de faire msg ="truc machin"; tu dois utiliser la fonction strcpy pour faire cela ;)
Donc, à la place, tu dois faire strcpy(msg, "Hello world !");
(désolé pour l'explication qui n'est pas très claire :p )

thoduv
13/07/2006, 17h55
Pour ton deuxième problème, je crois savoir d'où vient le problème :
Tu as msg qui ets un pointeur char, mais tu n'as pas le droite de faire msg ="truc machin"; tu dois utiliser la fonction strcpy pour faire cela ;)
Donc, à la place, tu dois faire strcpy(msg, "Hello world !");
(désolé pour l'explication qui n'est pas très claire :p )
:blink: ... ... ... :biggrinth
En fait c'est pas exact: pour pouvoir faire strcpy y faut que msg pointe vers quelque chose, donc le déclarer du style char msg[256]; (ajuster le 256 selon les données qu'elle aura a contenir)

Spyk, si tu fais des erreurs comme ca, je te conseille lire (rapidement, ou pas) quelques cours de C avant de te lancer dans de la programmation réseau... :)
Ta variable buf est mal déclarée aussi, là tu as déclaré un tableau de pointeurs, et non pas un buffer. Pareil que msg: char buf[BUF_SIZE];

Pour ce qui est de la valeur de retour de recv aussi: -1 si on a rien recu, 0 si la connection a été perdue, et >1 si y'a des données recues. Vérifie donc plutot avec if(recv(...) <= 0) { erreur... } else { recu quelque chose }

Dr.Vince
13/07/2006, 18h04
pas tout à fait d'accord non plus Thoduv, tu peux utiliser du char* et strcpy à condition de faire le malloc qui va bien avant ton strcpy.

tu peux également faire ça

char *toto = "ma chaine";

mais toto sera alors une chaine constante, donc pour être plus prorpre tu fait :

const char *toto = "ma chaine";

par contre je sais pas si tu peux le faire en 2 fois (et du coup pas propre car pas de const) :

char *toto ;
toto = "machaine" ;

voilà

spyk
13/07/2006, 20h05
Ha.
Et bien, merci pour tout vos conseil.
Dr.Vince, tu avais raison, parceque, dans mon livre, il y avais ca :

char *msg = "Message!";
int len, bytes_sent;
.
.
len = strlen(msg);
bytes_sent = send(sockfd, msg, len, 0);

Alors moi je mesuis dit, "Ba tient, je vais le faire en deux fois..."
Resultat plus rien ne marche...
En tout cas, maintenant, ca devrais marcher :)
Je teste ca tout a l'heure et je reviens.
Sinon, ca ne me dit toujour pas, pourquoi je peux utiliser la fonction recv() qu'une seul fois.
Sinon, tu a aussi bien raison, il est grand temps que je ressorte mon livre au chapitre "Pointeurs" que je n'ais pas regardé depuis un an..

spyk
13/07/2006, 20h56
Bon, alors, j'ai corrigés les erreurs que vous avez reperez, j'ai jetez un coup d'oeil a mon livre au passage, et voici mon nouveau code.. (pas grand chose de changer.)


void start_client()
{
int sockfd, numbytes, sentbytes;
char buf[MAXDATASIZE];
char *msg[13];
struct hostent *he;
struct sockaddr_in their_addr; /* Adresse de celui qui se connecte */

if ((he=gethostbyname("192.168.0.1")) == NULL)
{ /* Info de l'hôte */
oslPrintf("erreur avec gethostbyname\n");

}

//Création du socket
if ((sockfd = socket(AF_INET, SOCK_STREAM, 0)) == -1)
{
oslPrintf("error creating socket\n");
}
//Définition du socket
their_addr.sin_family = AF_INET; /* host byte order */
their_addr.sin_port = htons(PORT); /* short, network byte order */
their_addr.sin_addr = *((struct in_addr *)he->h_addr);
bzero(&(their_addr.sin_zero), 8); /* zero pour le reste de struct */

//Connection du socket
oslPrintf("Connection au PC \n");
if (connect(sockfd, (struct sockaddr *)&their_addr, sizeof(struct sockaddr)) == -1)
{
oslPrintf("error connecting socket\n");
}




oslPrintf("Reception de la chaine de texte\n");
if ((numbytes=recv(sockfd, buf, MAXDATASIZE, 0)) == -1)
{
oslPrintf("Rien a recevoir\n");
}
if (numbytes==0);
{
oslPrintf("Connection Perdue!\n");
}
if (numbytes >= 1);
{
buf[numbytes] = '\0';
oslPrintf("Recu: %s\n",buf);
}



oslPrintf("Boucle, appuyé sur bas, haut, ou start pour quitter\n");

while (!osl_quit)
{
oslWaitKey();
oslReadKeys();

if (osl_keys->held.down)
{
oslPrintf("Envoie du msg...\n");

strcpy(msg, "Hello world !");
sentbytes = send(sockfd, msg, strlen(msg), 0);

if (sentbytes <= 0)
{
oslPrintf("Erreur avec send()\n");
}
if (sentbytes >= 1)
{
oslPrintf("Bytes envoyées!\n");
}
}

if (osl_keys->held.up) oslPrintf("Vous appuyez Haut\n");
if (osl_keys->held.left) oslPrintf("Vous appuyez Gauche\n");
if (osl_keys->held.right) oslPrintf("Vous appuyez Droite\n");
if (osl_keys->held.start) break;

}


//Fermeture du socket
close(sockfd);
}



Donc, comme vous avez pus le voir, j'ai changer la facons de m'occuper du char msg :
non plus msg = "machin";
mais strcpy(msg, "Hello world !");

Remarquez aussi, que je ne declare plus buf comme un pointeur, car mon livre dit :

char buf[MAXDATASIZE];
et
numbytes=recv(sockfd, buf, MAXDATASIZE, 0);

Cependant, il reste quelques problemes :
1-
La psp m'affiche :
Connexion perdue
Recu : Connexion avec le server etablie!
Bon, alors la faudra m'expliquer comment numbytes peur etre égale a zero et en meme temps plus grand que 1 :S
A moin que je me sois tromper dans les operateurs, mais alors la, je retournerais apprendre le html :'(
2-
La fonction send n'envoie toujour rien, bien qu'elle retourne un chiffre plus grand que 1
3-
Je ne peux toujour pas utiliser plusieur fois recv()

Voila, j'espere ne pas avoir fait d'erreur de debutant, comme tout a l'heure, et j'espere aussi que vous pourrez m'aider.

Encore une fois, merci a vous.