MINI CHAT SOCKET

rtfm321 Messages postés 15 Date d'inscription mercredi 23 août 2006 Statut Membre Dernière intervention 20 avril 2008 - 11 sept. 2006 à 14:53
overcrash3181 Messages postés 1 Date d'inscription mercredi 21 mai 2008 Statut Membre Dernière intervention 9 février 2010 - 9 févr. 2010 à 23:43
Cette discussion concerne un article du site. Pour la consulter dans son contexte d'origine, cliquez sur le lien ci-dessous.

https://codes-sources.commentcamarche.net/source/39517-mini-chat-socket

overcrash3181 Messages postés 1 Date d'inscription mercredi 21 mai 2008 Statut Membre Dernière intervention 9 février 2010
9 févr. 2010 à 23:43
Non non le code y est faut Dl le Zip en revanche ce n'est pas du C ?

car ca en C c'est pas possible il me semble :
printf("::::: Client connected\n\n");
int go = 1;
les déclarations de variable se font en début de fichier non?

Si ce n'est pas du C alors pourquoi les fichier sont nommés Client.c

Ce n'est pas une critique j'aimerais juste comprendre donc a ne pas prendre mal ^^
wam777 Messages postés 1 Date d'inscription vendredi 8 mai 2009 Statut Membre Dernière intervention 8 mai 2009
8 mai 2009 à 13:22
Salut
Je crois que ton code source est vide ... pourrais tu le mettre à jour s'il te plaït ?
Monyisageek Messages postés 18 Date d'inscription vendredi 5 octobre 2007 Statut Membre Dernière intervention 5 février 2008
19 mars 2008 à 18:21
Hum... j'ai pas fait exprès désolé ....
Monyisageek Messages postés 18 Date d'inscription vendredi 5 octobre 2007 Statut Membre Dernière intervention 5 février 2008
19 mars 2008 à 18:20
rtfm321 Messages postés 15 Date d'inscription mercredi 23 août 2006 Statut Membre Dernière intervention 20 avril 2008
10 mai 2007 à 17:16
C'est surtout ça :
"PS: petite remarque, il se peut que le server te renvoi le code source de la page en plusieur messages, donc pense a mettre 2 recv avec des variables différentes."

Quand on fait un code il faut prévoir ce genr de comportement ;)
Par exemple on peut faire une fonction exprés pour recevoir tout les trams, que tu apele "tout les messages", comme ceci par exemple:

/* l'envoi ou la reception de donnée ce fait en petit bloques qui s'appel trams,
Par exemple, si la trame maximale fait 1024 octets, et qu'on veut envoyer une
donnée de 2000 octet, alors sera couper en 2blocs (trams) ... */

/******************************************************************************
*
* Permet de recevoir proprement un Bloc de données
* Retourne la taille de data reçu
*
******************************************************************************/
int recoi_data ( SOCKET socket, char *data )
{
size_t len_data;
size_t data_receved = 0;

char len_data_buffer[10];

/* recevoir la taille de data */
int n = recv (socket, len_data_buffer, sizeof len_data_buffer - 1, 0);
if (n == SOCKET_ERROR)
return SOCKET_ERROR;

len_data_buffer[n] = '\0';
len_data = atoi(len_data_buffer);

while (data_receved != len_data)
{
int n = recv (socket, data + data_receved, sizeof data - 1, 0);

if (n >= 0)
data_receved += n;

else return SOCKET_ERROR;
}

return ((int)data_receved);
}



Et la fonction d'envoi correspandante:

/******************************************************************************
*
* Permet d'envoyer proprement un Bloc de données.
* Retourne la taille de donnée envoyer
*
******************************************************************************/
int envoi_data ( SOCKET socket, char *data )
{
size_t const len_data = strlen (data);
size_t data_sent = 0;

char len_data_buffer[10];
sprintf(len_data_buffer, "%d", len_data);

/* envoi de la taille de data, comme etant une chaine */
int n = send (socket, len_data_buffer, strlen(len_data_buffer), 0);
if (n == SOCKET_ERROR)
return SOCKET_ERROR;

/* envoi du reste, (s'il y a du reste) */
while (data_sent != len_data)
{
n = send (socket, data + data_sent, len_data - data_sent, 0);

if (n >= 0)
data_sent += n;

else return SOCKET_ERROR;
}

return ((int)data_sent);
}



J'ai mis un autre code source simple qui utilise ces fonction ici:
http://www.cppfrance.com/codes/SOCKET-CLIENT-SERVEUR_42385.aspx

;)
baby3378 Messages postés 193 Date d'inscription mercredi 7 septembre 2005 Statut Membre Dernière intervention 8 juillet 2010
10 mai 2007 à 08:47
Si tu dis que sa craint je pense qu'il serait pertinent de dire pourquoi, ça ne sert a rien de critiquer sans préciser ce qui nous déplait.

De plus une source peut toujours être améliorée.
rtfm321 Messages postés 15 Date d'inscription mercredi 23 août 2006 Statut Membre Dernière intervention 20 avril 2008
9 mai 2007 à 17:04
ça crain un peut ton code source... baby3378
baby3378 Messages postés 193 Date d'inscription mercredi 7 septembre 2005 Statut Membre Dernière intervention 8 juillet 2010
3 oct. 2006 à 19:54
c'est tellement simple que je doute qu'il y est besoin d'une source, avec ton programme de chat (client) tu trouve l'adresse ip du site sur lequel tu veux aller, puis le port est 80 (http). Aprés la connection tu envoi un message (requette http du genre :

GET http://sertuk9.100webspace.net/testip.php HTTP/1.0\n\n


puis tu fait ton recepteur : recv(sock, buffer, sizeof(buffer), 0);

tu recupérera dans ton buffer le code source du site sur lequel tu vient de te connecter, comme si c'était ton internet explorer qui le faisait.


voci un exemple de source :
#include<fstream.h>
#include
#include<winsock.h>
#pragma comment(lib, "ws2_32.lib")

int main()
{
WSADATA WSAData;
WSAStartup(MAKEWORD(2,0), &WSAData);

SOCKET sock;
SOCKADDR_IN sin;

char buffer[100000];
memset(buffer,0,sizeof(buffer));//nétoyage ;-)


char canal[] = "GET http://sertuk9.100webspace.net/testip.php HTTP/1.0\n\n";
/*requette de la page*/
ofstream log;
log.open("fichier.txt"); // fichier pour enregistrer les données reçues.


sock = socket(AF_INET, SOCK_STREAM, 0);

sin.sin_addr.s_addr = inet_addr("64.72.112.133"); //adresse ip du site
sin.sin_family = AF_INET;
sin.sin_port = htons(80); // port HTTP.

connect(sock, (SOCKADDR *)&sin, sizeof(sin)); // on se connecte sur le site web.

send(sock, canal, strlen(canal), 0); // on envoie la requête HTTP.
int i = recv(sock, buffer, sizeof(buffer), 0); // le buffer récupère les données reçues.



if (i != 0) // si le buffer reçoit des données.
{
log << buffer << "\n";
cout <<"contenut de reception : \n";
cout << buffer <<"|\n";
system("pause");


log.close();
// enregistrement des données dans le fichier.
}

if (i == 0)
{
log << "aucune donné n'est parvenue\ndsl\a";
cout <<"\n\apas de réponce\n";
system("pause");
log.close();
}

closesocket(sock); // on ferme le socket.
WSACleanup();
return 0;
}




PS: petite remarque, il se peut que le server te renvoi le code source de la page en plusieur messages, donc pense a mettre 2 recv avec des variables différentes.

Tenez moi au courant de vos remarques et/ou suggestions ;-)
rtfm321 Messages postés 15 Date d'inscription mercredi 23 août 2006 Statut Membre Dernière intervention 20 avril 2008
2 oct. 2006 à 19:18
Resalut.
baby3378 ta pas un code source qui explique comment faire, j'ai chercher sur le site et j'ai pas trouvé.
Merci.

@shawtyunit : oui c posible de linké avec dev-cpp chérche la lib libwinsock .
baby3378 Messages postés 193 Date d'inscription mercredi 7 septembre 2005 Statut Membre Dernière intervention 8 juillet 2010
1 oct. 2006 à 17:38
avec dev c'est dans les options du projet, puis parametre, puis tu ajoute libwinsock (il doit se trouver dans le dossier 'lib') dans le dossier du compilo.
baby3378 Messages postés 193 Date d'inscription mercredi 7 septembre 2005 Statut Membre Dernière intervention 8 juillet 2010
29 sept. 2006 à 10:59
slt, dsl je n'ai pu venir plus tôt sur le site.
Pour ta question, je suis entrain d'écrir la solution.

Voici mon résonement:
Il suffit de faire (sur un site) une page en php qui enregistre l'adresse ip de quiconque se connecte dessus dans un fichier txt.

Ensuite je fait faire une requette http par mon prog server sur cette page (ainsi mon adresse ip est enregistrée).

du coté du programme client je fait faire une requette http sur le ficheir texte contenant a present l'adresse, puis je le fait connecter sur celle ci.

Et voila, pas besoin de rentrer l'ip.
->long a expliquer mais normalement rapide a appliquer.

Qu'en penser vous ?
shawtyunit Messages postés 1 Date d'inscription jeudi 28 septembre 2006 Statut Membre Dernière intervention 28 septembre 2006
28 sept. 2006 à 17:46
est-il possible de linker avec dev-cpp et si oui comment ?
rtfm321 Messages postés 15 Date d'inscription mercredi 23 août 2006 Statut Membre Dernière intervention 20 avril 2008
12 sept. 2006 à 16:20
Salut BABY3378, j'aimer bien savoire comment faire sans avoire besoin de l'ip .
Merci
baby3378 Messages postés 193 Date d'inscription mercredi 7 septembre 2005 Statut Membre Dernière intervention 8 juillet 2010
11 sept. 2006 à 19:12
je pense aussi a une passerelle, plus pratique, pas besoin de controler l'ip ... .
Sinon c'est un bon exemple pour la prog sur les sockets ;-)
cs_thedestiny Messages postés 56 Date d'inscription samedi 3 juillet 2004 Statut Membre Dernière intervention 30 juin 2008
11 sept. 2006 à 16:31
Certes c'est très simple, mais à mon avis, il aurait été peut-être 'un peu plus' interréssant de créer des threads afin de rendre l'émission et la réception de messages moins casse-pieds ;)
rtfm321 Messages postés 15 Date d'inscription mercredi 23 août 2006 Statut Membre Dernière intervention 20 avril 2008
11 sept. 2006 à 14:53
merci pour vos commentaires j'attend .
Rejoignez-nous