Vous ne trouvez pas de réponse à votre problème ? Alors posez la question dans le forum. Souvenez-vous qu'il n'y a jamais de question bête, mais rester dans l'ignorance parce que l'on n'ose pas poser une question, ça c'est une erreur !

CHAT CLIENT/SERVEUR EN API UTILISANT WINSOCK


Information sur la source

Catégorie :Réseaux & Internet Niveau : Débutant Date de création : 03/02/2005 Date de mise à jour : 03/02/2005 22:54:39 Vu / téléchargé: 5 625 / 1 042

Note :
8 / 10 - par 6 personnes
8,00 / 10

  • 1

  • 2

  • 3

  • 4

  • 5

  • 6

  • 7

  • 8

  • 9

  • 10

Commentaire sur cette source (6)
Ajouter un commentaire et/ou une note


Description

Cliquez pour voir la capture en taille normale
Voila, débutant avec Winsock, je m'etais posé comme défis de réaliser un petit chat ou plusieurs clients pouvez se connecter à un même serveur et dialoguer entre eux. Il reste cependant quelques bugs ( mineurs ? ) qui reste à corriger, ce que je tenterai de faire par la suite ( pas bcp de temps pour le moment ).

Voila, j'attends vos ritiques ce qui permettra ( peut-être ) de pouvoir progresser :)
 

Source

  • /*********************************************/
  • /* Serveur */
  • /*********************************************/
  • #include <stdio.h>
  • #include <conio.h>
  • #include <winsock.h>
  • #pragma comment(lib,"WSOCK32.LIB")
  • #include "main.h"
  • char buf[1024];
  • int main()
  • {
  • int Res;
  • wVersionRequested=MAKEWORD(1,1);
  • Res = WSAStartup(wVersionRequested,&wsaData);
  • if(Res!=0)
  • {
  • return DisplayErreur("WSA ne veut pas s'initialiser.", 1);
  • }
  • Sock = socket(AF_INET,SOCK_STREAM,IPPROTO_TCP);
  • ZeroMemory(&Addr,sizeof(Addr));
  • Addr.sin_family = AF_INET;
  • Addr.sin_addr.S_un.S_addr = INADDR_ANY;
  • Addr.sin_port = htons(1014);
  • Res = bind(Sock, (struct sockaddr*)&Addr, sizeof(Addr));
  • if(Res!=0)
  • {
  • return DisplayErreur("Les sockets deconnent.", 1);
  • }
  • Res = listen(Sock, 16);
  • if(Res!=0)
  • {
  • return DisplayErreur("Impossible de proceder a l'ecoute.", 1);
  • }
  • printf("Le serveur est lance.\nAttente de connexion de la part des clients.\n");
  • New_Sock = new SOCKET;
  • while(bContinue)
  • {
  • Cnx++;
  • New_Sock[Cnx] = accept(Sock, (struct sockaddr*) NULL, (int *) NULL);
  • printf("Client connecte. ( %d total )\n", Cnx);
  • hThread = CreateThread(NULL, 0, (LPTHREAD_START_ROUTINE)Echo, (LPVOID)New_Sock[Cnx], 0, &dwThread);
  • }
  • CloseHandle(hThread);
  • return 0;
  • }
/*********************************************/
/*                                  Serveur                                        */
/*********************************************/

#include <stdio.h>
#include <conio.h>
#include <winsock.h>
#pragma comment(lib,"WSOCK32.LIB")

#include "main.h"

char buf[1024];

int main()
{
	int Res;

	wVersionRequested=MAKEWORD(1,1);
	Res = WSAStartup(wVersionRequested,&wsaData);

	if(Res!=0)
	{
		return DisplayErreur("WSA ne veut pas s'initialiser.", 1);
	}

	Sock = socket(AF_INET,SOCK_STREAM,IPPROTO_TCP);

	ZeroMemory(&Addr,sizeof(Addr));
	Addr.sin_family = AF_INET;
	Addr.sin_addr.S_un.S_addr = INADDR_ANY;
	Addr.sin_port = htons(1014);

	Res = bind(Sock, (struct sockaddr*)&Addr, sizeof(Addr));

	if(Res!=0)
	{
		return DisplayErreur("Les sockets deconnent.", 1);
	}

	Res = listen(Sock, 16);

	if(Res!=0)
	{
		return DisplayErreur("Impossible de proceder a l'ecoute.", 1);
	}

	printf("Le serveur est lance.\nAttente de connexion de la part des clients.\n");

	New_Sock = new SOCKET;

	while(bContinue)
	{
		Cnx++;
		New_Sock[Cnx] = accept(Sock, (struct sockaddr*) NULL, (int *) NULL);				
		printf("Client connecte. ( %d total )\n", Cnx);

		hThread = CreateThread(NULL, 0, (LPTHREAD_START_ROUTINE)Echo, (LPVOID)New_Sock[Cnx], 0, &dwThread);
	}

	CloseHandle(hThread);

	return 0;
}

Conclusion

Voila, je tiens à remercier tous ceux qui déposent les sources car ca m'a permis de pas mal comprendre de choses depuis que je code :)
 

Fichier Zip

Pour les "Membres Club", vous pouvez télécharger directement un fichier contenu dans le zip sans télécharger le zip en entier !

Télécharger le zip

Historique

03 février 2005 22:54:39 :
Corrections d'anneries...

Commentaires et avis

signaler à un administrateur
Commentaire de BruNews le 03/02/2005 22:37:14 administrateur CS

Que fait de l'implementation dans des fichiers h ???
TerminateThread() ne devrait jamais etre employe, c'est une instruction d'urgence pour le debug et situations de ce genre. Un thread doit sortir proprement en liberant ses ressources. A ce propos, je n'ai pas vu les CloseHandle() correspondants a chaque CreateThread().
On verra le reste quand la synchro des threads sera realisee.

signaler à un administrateur
Commentaire de thedestiny le 03/02/2005 22:58:02

Merci pour la remarque ^^
Les fichiers *h à la base ne devaient contenir que les prototypes de fonction et je vois pas comment je suis arrivé à y mettre les fonctions dedans...
J'ai remplacé le TerminateThread par le CloseHandle(), qui pendant mes tests avait des défaillances, enfin maintenant ca à l'air d'etre bon
Pour la synchro des threads, c'est simple je sais pas faire :P ( c'est pas pour rien que j'ai dis que j'etais débutant :p )

signaler à un administrateur
Commentaire de DeAtHCrAsH le 04/02/2005 21:20:51

Juste une petite remarque en ce qui concerne ton titre.
"...API utilisant Winsock" n'est pas approprié.
Ici tu n'utilises que des fonctions standards du C.
Ce n'est pas de l'API (Application Programming Interace).

Sinon, pour éviter les threads tu peux aussi bien utiliser des sockets asynchrones.

Shell

signaler à un administrateur
Commentaire de Arcagi le 21/03/2005 19:40:46

Salut,

Je trouve le code intéressant, et assé simple à comprendre. De mon côté j'ai testé et cela marche très bien :-)

Sinon, je n'est pas bien compris le terme d'API, pour moi cela ressemble bien à une API ! J'ai la bible du programmeur en C/C++ et le style de programmation ressemble étrangement à celui-ci...et dans cette bible ils appellent cela une API. ;-)

signaler à un administrateur
Commentaire de mythic_kruger le 04/07/2005 16:54:57

Au vu des 4 premières lignes de code il s'agit bien de l' API Winsock. Cette couche représentée par la librairie dynamique peut être utilisée depuis C ou VB avec quasiment la même syntaxe d'ou l' appellation d' Interface de Programmation d' Application (API).

signaler à un administrateur
Commentaire de deck_bsd le 20/09/2007 20:01:44

Yop,


intéressant comme code, cependant, Msg_Recu est une variable ou tout les threads écrivent dedans. Cela pourrait engandrer plusieur problème . Imagine que un thread écrive le message reçu et que avnt que celui-ci l'ai renvoyé , un autre écrit sont message reçu, ben le 1er thread n'envoie pas le message que lui à reçu :s . Tu devrait synchroniser tes threads :D

++

Ajouter un commentaire



Nos sponsors

Sondage...

CalendriCode

Juillet 2009
LMMJVSD
  12345
6789101112
13141516171819
20212223242526
2728293031  

Consulter la suite du CalendriCode

Comparez les prix Nouvelle version

Photothèque Nouveau !



Développement réalisé par Nicolas SOREL (Nix) avec l'aide de : Cyril DURAND et Emmanuel (EBArtSoft), Merci à Vincent pour ses précieux conseils
CodeS-SourceS.com© Toute reproduction même partielle est interdite sauf accord écrit du Webmaster
CodeS-SourceS.com© est une marque déposée tous droits réservés
Temps d'éxécution de la page : 0,265 sec

Google Coop CodeS-SourceS Google Coop CodeS-SourceS


Certaines images présentes sur le site (notament certains avatars) sont issues des collections IconShock, donc si vous souhaitez utiliser ces icons vous devez les acheter, ne les copiez pas et ne utilisez pas dans vos sites et applications sans les avoir commandé.