Socket sous win [C/C++] - Programmation
Marsh Posté le 15-06-2002 à 16:42:57
et aussi j'en profite pour dire que si je force en mettant "== INVALID_SOCKET", il reçoit en permanence ceci : "¤M?" (hexa : A44D95), qu'il écrit dans le fichier c:\test.ini ...
C'est koi ?
merci
Marsh Posté le 15-06-2002 à 17:03:27
Code :
|
Tu es sur à 100% qu'il n'y a pas d'erreur avec ces fonctions
Le 'INVALID_SOCKET' signifie surement que le paramètre 'sock' n'est pas le descripteur d'une socket correctement créée et disponible.
Marsh Posté le 15-06-2002 à 18:06:08
mrbebert a écrit a écrit :
Tu es sur à 100% qu'il n'y a pas d'erreur avec ces fonctions |
euh ... ben non pas 100 % mais ça devrait être ça, dans l'aide de bind, ce paramètre : The length of the name.
...
merci
@++
Marsh Posté le 15-06-2002 à 18:21:06
juju_le_barbare a écrit a écrit : euh ... ben non pas 100 % mais ça devrait être ça, dans l'aide de bind, ce paramètre : The length of the name. ... merci @++ |
Vérifie les codes de retour des fonctions
Marsh Posté le 16-06-2002 à 02:07:47
mrbebert a écrit a écrit : Vérifie les codes de retour des fonctions |
et bien justement j'ai bien regardé !
mais en fait le problème ne vient pas de bind je pense.
Regarde j'ai encore modifié, c'est la fonction serveur() qui merde donc :
Code :
|
j'ai mis l'erreur en commentaire. En fait faudrait que je marcque != INVALID_SOCKEt, et là il dirait pas invalid socket mais le soft freeze dans les 2 cas de toute façon...
au fait pour la partie client j'ai vu un source ainsi :
struct hostent *he;
...
memset((char *)&blah, 0, sizeof(blah));
...
if ((he = gethostbyname(server)) != NULL)
memcpy((char *)&blah.sin_addr, he->h_addr, he->h_length);
...
et lorsqu'il y a ces istructions on peut marquer le nom de l'ordi à la place de l'IP et ça marche (mais j'ai pas réussi à l'inclure dans mon code du client on verra plus tard)
c'est quoi exactement ?
merci
Marsh Posté le 16-06-2002 à 08:43:51
deja tu fait un recv sur sock alors que sock est ta socket qui recoi les connexions. il faut que tu fasse recv sur la socket val. kan ton client se connecte a ton serveur, accept et sencé accepté et retourne une socket qui permet de dialoguer avec le client.
Code :
|
voila un exemple, après ca tu peu effectivement faire ton accept (si ca tourne en boucle c surement que ta po fait de listen)
Marsh Posté le 16-06-2002 à 09:15:42
sanglier04 a écrit a écrit : deja tu fait un recv sur sock alors que sock est ta socket qui recoi les connexions. il faut que tu fasse recv sur la socket val. kan ton client se connecte a ton serveur, accept et sencé accepté et retourne une socket qui permet de dialoguer avec le client.
|
j'analyse tout ça, merci !!!
@++
Marsh Posté le 16-06-2002 à 12:56:26
salut,
en m'inspirant très fortement sur ton code, voici ce que j'ai fait :
Code :
|
a priori le code s'exécute bien, mais comment faire pour par exemple afficher dans ListBox1 (Form1->ListBox1->Items->Add()) le contenu de ce qu'il reçoit ???
Code :
|
ne fait rien ... meme avec netstat ça fait rien ... merci
merci de votre aide
Marsh Posté le 16-06-2002 à 14:32:43
maintenant que ta cré ta socket serveur tu lui dit d'attendre des connexion : accept (g_sock_srv...); puis a chaque fois qu'un client vas se connecter accept vas te retourner une socket connecté a ce client et la ta plus ka faire un recv sur la socket que vien de te renvoyer accept
Marsh Posté le 16-06-2002 à 14:48:50
sanglier04 a écrit a écrit : maintenant que ta cré ta socket serveur tu lui dit d'attendre des connexion : accept (g_sock_srv...); puis a chaque fois qu'un client vas se connecter accept vas te retourner une socket connecté a ce client et la ta plus ka faire un recv sur la socket que vien de te renvoyer accept |
je teste merci, vraiment !
Marsh Posté le 16-06-2002 à 16:16:39
salut,
et bien j'ai modifié le code ainsi, il y a 2 fonctions, connexion_serveur() et reception_serveur().
Pour utiliser ce code, j'appelle ces 2 fonctions succéssivement. La suite après le code...
Code :
|
Avec ce code, il est déjà à noter que vers la fin, où je l'ai indiqué en commentaires, j'ai du inverser le test, à priori la
fonction recv() renvoie toujours SOCKET_ERROR.
Mais ensuite après l'inversion le serveur est bien en écoute, lorsque je lance les 2 fonctions ainsi :
Code :
|
et bien il attend, rien n'est écrit dans Form1->Memo2
Donc pour tester, je lance un client (ça j'y arrive parfaitement à le faire), et lorsque je me connecte sur 127.0.0.1:80, hop le
serveur écrit "(&?" (ou bien d'autres signes ...) dans Form1->Memo2 à l'infini (logique vu que c'est while(true)), mais
je m'en fous de ces signes, j'aimerais recevoir ce que le client envoie (le client connecté à beau envoyer des données, le serveur
continue toujours d'afficher sans fin ces signes...).
Par contre si je deconnecte le client, je sais pas si il continue d'afficher les signes, mais ça freeze ...
Comment faire pour qu'il ne reçoive plus ceux-ci, et qu'il écoute en permanence pour recevoir les caractères envoyés par un client
à la place des signes ?
Merci d'avance à vous
Marsh Posté le 16-06-2002 à 16:50:52
Pourquoi MSG_OOB dans les paramètres du recv
Essaie en mettant simplement 0.
Marsh Posté le 17-06-2002 à 12:21:53
mrbebert a écrit a écrit : Pourquoi MSG_OOB dans les paramètres du recv Essaie en mettant simplement 0. |
merci m'sieur bebert, je teste ça le plus vite possible !
Marsh Posté le 17-06-2002 à 14:15:13
juju_le_barbare a écrit a écrit : merci m'sieur bebert, je teste ça le plus vite possible ! |
Fais attention aussi au type de données transférées. Ce qui est envoyé, c'est une suite d'octets. Rien ne dit que ce sera un chaine de caractère valable (avec un 0 à la fin).
Que se passe t'il avec le Form1->Memo2->Lines->Add(buff) si il n'y a pas une chaine correcte dans buff ? Essaie de mettre les 256 octets de buff à '\0' avant chaque recv pour être sur de ne pas avoir de problème à ce niveau là.
Marsh Posté le 17-06-2002 à 22:10:43
mrbebert a écrit a écrit : Fais attention aussi au type de données transférées. Ce qui est envoyé, c'est une suite d'octets. Rien ne dit que ce sera un chaine de caractère valable (avec un 0 à la fin). Que se passe t'il avec le Form1->Memo2->Lines->Add(buff) si il n'y a pas une chaine correcte dans buff ? Essaie de mettre les 256 octets de buff à '\0' avant chaque recv pour être sur de ne pas avoir de problème à ce niveau là. |
Et bien voici la nouvelle fonction d'écoute du socket :
Code :
|
Donc au lieu d'afficher les signes bizarres, ça affiche sans fin rien... mais des lignes s'ajoutent...
Je comprends pas même quans le client connecté dessus envoie rien le serveur dit qu'il reçoit toujours qqchose ... mais du vide en fait ! En plus le soft bloque ...
Merci de votre temps que vous me consacrez
@++
Marsh Posté le 17-06-2002 à 22:15:07
juju_le_barbare a écrit a écrit : Et bien voici la nouvelle fonction d'écoute du socket :
|
Marsh Posté le 18-06-2002 à 20:37:03
Quand recv renvoie SOCKET_ERROR, affiche le résultat de WSAGetLastError() pour savoir quel est le problème.
Certaines 'erreurs' n'en sont pas vraiment, par exemple :
- WSAEWOULDBLOCK : il n'y a pas de données à lire mais, la socket n'étant pas bloquante, la fonction retourne quand même
Marsh Posté le 15-06-2002 à 16:22:32
bonjour,
j'essaye de m'initier aux socket (sous win).
Donc en fait ce que j'ai fait c'est 2 fonctions,
* une qui s'appelle client();, qui créé un socket puis qui l'utilise en tant que client.
* une qui s'appelle server();, qui créé un socket puis qui l'utilise en tant que server.
voici le code que ça donne :
ensuite à partir de la fonction main(); j'appelle la fonction client(); ou server(); en passant les paramètres, l'IP et le
port de destination pour client, et juste le port d'écoute pour server();
Pour faire mes tests je lance netstat en ligne de commande.
Le client marche très bien, un server que j'ai pas codé reçoit les données envoyées...
Au fait question subsidiaire, comment choisir le port local pour l'envoi, actuellement c'est un port au hasard je crois.
Par contre le serveur marche pas, en le debuggant, il repete sans fin ce code :
while(true)
{
sizeofsin = sizeof(sin);
if((val = accept(sock, (SOCKADDR *)&sin, &sizeofsin)) != INVALID_SOCKET)
Donc il considère toujours val comme un INVALID_SOCKET ...
A moins qu'il faille que ça valle INVALID_SOCKET pour que ça marche, non ?
Encore une question, comment faire une 3eme fonction, par exemple open_sock(); appelée par server(); ou client(); qui créé le socket ?
Quels paramètres et quelles valeur de retour je dois mettre ?
Merci de votre aide !
@++
---------------
Visitez mon site : http://www.jujubarbare.linux-fan.com