Chat client/serveur en api utilisant winsock

0/5 (6 avis)

Vue 8 887 fois - Téléchargée 1 292 fois

Description

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 / Exemple :


/*********************************************/
/*                                  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 :)

Codes Sources

A voir également

Ajouter un commentaire Commentaires
deck_bsd
Messages postés
1243
Date d'inscription
jeudi 31 mars 2005
Statut
Membre
Dernière intervention
3 août 2016
2
20 sept. 2007 à 20:01
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

++
mythic_kruger
Messages postés
241
Date d'inscription
jeudi 8 janvier 2004
Statut
Membre
Dernière intervention
10 novembre 2005

4 juil. 2005 à 16:54
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).
Arcagi
Messages postés
4
Date d'inscription
dimanche 11 avril 2004
Statut
Membre
Dernière intervention
21 mars 2005

21 mars 2005 à 19:40
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. ;-)
DeAtHCrAsH
Messages postés
2670
Date d'inscription
vendredi 25 janvier 2002
Statut
Membre
Dernière intervention
6 février 2013

4 févr. 2005 à 21:20
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
cs_thedestiny
Messages postés
56
Date d'inscription
samedi 3 juillet 2004
Statut
Membre
Dernière intervention
30 juin 2008

3 févr. 2005 à 22:58
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 )
Afficher les 6 commentaires

Vous n'êtes pas encore membre ?

inscrivez-vous, c'est gratuit et ça prend moins d'une minute !

Les membres obtiennent plus de réponses que les utilisateurs anonymes.

Le fait d'être membre vous permet d'avoir un suivi détaillé de vos demandes et codes sources.

Le fait d'être membre vous permet d'avoir des options supplémentaires.