Rechercher : dans
Par :

[C] Client / Serveur

Dernière réponse le 20 mai 2005 à 15:11:45 kij_82, le 18 mai 2005 à 11:32:35 
 Signaler ce message aux modérateurs

Bonjours,

je demande votre aide pour la création d'un prog client, et d'un prog serveur en C .... sous windows !
Oui, sous Unix / Linux c'est simple, mais sous windows c'est carément merdique !
J'utilise Microsoft Visual C++ 6.0. Je voudrais avoir un exemple de prog pour les deux cas (client et serveur) (ca c'est pas trop dur). J'en ai déjà un pour linux, et pour windows mais de dernier ne marche pas donc je prefere partir d'une autre base.. donc si vous avez...
Je voudrais également savoir ce qu'il faut rajouter à la compil et pour linker pour que ca marche car moi il me met (pour ceux que j'ai déjà fait) comme quoi le type 'SOCKET' est mal utilisé... et ce pour tout les types de données déclaré dans 'winsock2.h' !!

Je comprend pas trop alors si qqun a l'immense gentillesse de m'aider je l'en remercie beaucoup.

++ ~ iclic @ gauch,iclic,  iclic @ droate, iclic, iclic
             et ya pas de bôg môsieu !    ~

Meilleures réponses pour « [C] Client / Serveur » dans :
Environnement Client/Serveur VoirPrésentation de l'architecture d'un système client/serveur De nombreuses applications fonctionnent selon un environnement client/serveur, cela signifie que des machines clientes (des machines faisant partie du réseau) contactent un serveur, une...
Réseaux - Architecture client/serveur à 3 niveaux VoirPrésentation de l'architecture à 2 niveaux L'architecture à deux niveaux (aussi appelée architecture 2-tier, tier signifiant rangée en anglais) caractérise les systèmes clients/serveurs pour lesquels le client demande une ressource et le serveur la...

1

kij_82, le 18 mai 2005 à 14:49:24

Personne alors ? ~ iclic @ gauch,iclic,  iclic @ droate, iclic, iclic
             et ya pas de bôg môsieu !    ~

Répondre à kij_82

2

mamiemando, le 18 mai 2005 à 14:52:07

Euh le CORBA ça existe sous Windows ? Normalement c'est fait pour développer des applis clients serveur en C++/Java.

Répondre à mamiemando

4

kij_82, le 18 mai 2005 à 14:58:40

J'ai préciser en C ! ~ iclic @ gauch,iclic,  iclic @ droate, iclic, iclic
             et ya pas de bôg môsieu !    ~

Répondre à kij_82

3

Dinheru, le 18 mai 2005 à 14:52:32

J'aurais bien voulu t'aider pour te rendre l'ascenseur parce que tu m'as pas mal aidé, mais là je connais vraiment pas assez pour pouvoir t'aider. Désolé. La vie c'est comme du chocolat, parfois dur et amer,
parfois chaud et sucré. 

Répondre à Dinheru

5

kij_82, le 18 mai 2005 à 14:59:05

Pas grave merci quand meme. ~ iclic @ gauch,iclic,  iclic @ droate, iclic, iclic
             et ya pas de bôg môsieu !    ~

Répondre à kij_82

6

440LVB, le 18 mai 2005 à 15:26:25

Il y a de la prog de sockets dans les MFC, ca se rapproche d'unix non? Va voir sur msdn, je pense que c'est expliqué dans l'aide en ligne.

Répondre à 440LVB

7

sam3000, le 18 mai 2005 à 15:41:34

Salut kij_82
tu t'attend à ce que je t'aide? oui? non? bon, je vais essayer bien que je ne suis specialiste en Visual C++ (mais plustot en VB)
mais bon, pour ce vieux kij, on fait une exception!
L'erreur est humaine mais un véritable désastre
ne peut être qu'informatique.

Répondre à sam3000

8

kij_82, le 18 mai 2005 à 15:51:51

Hiiii merki ! ~ iclic @ gauch,iclic,  iclic @ droate, iclic, iclic
             et ya pas de bôg môsieu !    ~

Répondre à kij_82

9

sam3000, le 18 mai 2005 à 16:08:14

Kij, tu n'es pas tenté d'utiliser autre chose que Visual C++, tel que Dev-C++ (gratuit et sous windows)??? L'erreur est humaine mais un véritable désastre
ne peut être qu'informatique.

Répondre à sam3000

10

kij_82, le 18 mai 2005 à 17:17:33

J'voudrais bien mais la boite ou je suis utilise ca donc je n'ai pas trop le choix... ~ iclic @ gauch,iclic,  iclic @ droate, iclic, iclic
             et ya pas de bôg môsieu !    ~

Répondre à kij_82

11

crabs, le 18 mai 2005 à 18:04:42

Salut,
J'ai trouvé ça sur le net:
http://www.planet-source-code.com/vb/scripts/ShowCode.asp?txtCodeId=2241&lngWId=3
Il me semble me rappeler que l'API socket de windows est similaire à l'API
socket d'UNIX moyennant le chargement de la dll qui va bien. ..., I think Slackware sounds better than 'Microsoft,'
-- Patrick Volkerding - founder and maintainer of Slackware

Répondre à crabs

12

tafiscobar, le 18 mai 2005 à 19:40:51

Salut, vas sur http://www.cppfrance.com tu y trouveras bcoup de code et il doit y avoir du code sur client serveur, tu fais une recherche, c'est une vrair base de données de code . tafiscobar "lou waye def bopame"
la nullite n'existe pas, l'ignorance oui, ah je suppose!!!

Répondre à tafiscobar

15

kij_82, le 19 mai 2005 à 09:18:54

C'est justement la dessus que j'ai pris exemple pour la version windows, mais ... marche pas !

merci quand même. ~ iclic @ gauch,iclic,  iclic @ droate, iclic, iclic
             et ya pas de bôg môsieu !    ~

Répondre à kij_82

13

mamiemando, le 19 mai 2005 à 09:06:26

Ben corba si je me souviens bien (c'est lointain et j'aimais pas ça ;o) ) tu écris un prototye (fichier idl), tu le compiles, et ça te génère le code c++ qui va avec. Maintenant évidemment si c'est juste du C et pas de C++ que tu veux faire...

Répondre à mamiemando

14

kij_82, le 19 mai 2005 à 09:14:23

Bah ouai... forcement... merci quand même ! ~ iclic @ gauch,iclic,  iclic @ droate, iclic, iclic
             et ya pas de bôg môsieu !    ~

Répondre à kij_82

16

kij_82, le 19 mai 2005 à 10:28:32

Quelqun qui connait le C et le C++ :
pourrati -t-il me faire la conversion de ce code C++ en C, s'il vous plait :) :

#include <iostream>
#include <stdlib.h>
#include <winsock2.h>


#pragma comment(lib, "ws2_32.lib")

using namespace std;

#define MAX_RQT 100;

int main(int argc, char *argv[])
{

int port;

printf("**********Serveur**********\n");
printf("Port que doit utiliser le serveur :");
scanf("%d",&port);

WSADATA WSAData;
WSAStartup(MAKEWORD(2,0), &WSAData);
SOCKET sock;
SOCKET csock;
SOCKADDR_IN sin;
SOCKADDR_IN csin;
sock = socket(AF_INET, SOCK_STREAM, 0);
if(sock == SOCKET_ERROR)
printf("erreur socket()\n");
sin.sin_addr.s_addr = INADDR_ANY;
sin.sin_family = AF_INET;
sin.sin_port = htons(port);
if(bind(sock, (SOCKADDR *)&sin, sizeof(sin)) == SOCKET_ERROR)
printf("erreur bind(): %d\n", WSAGetLastError());
if(listen(sock, 0) == SOCKET_ERROR)
printf("erreur listen(): %d\n", WSAGetLastError());
printf("Serveur en route...\nPort = %d\n",port);

while(1)
{
int sinsize = sizeof(csin);
if((csock = accept(sock, (SOCKADDR *)&csin, &sinsize)) != INVALID_SOCKET)
{
send(csock, "Bienvenue chez moi !\r\n", 23, 0);
}
}

system("PAUSE"); 
return 0;
}


J'ai beau essayé (au niveau des include ca bloque si je converti en C), j'y arrive pas !!


Grand merci.

++ ~ iclic @ gauch,iclic,  iclic @ droate, iclic, iclic
             et ya pas de bôg môsieu !    ~

Répondre à kij_82

17

m0n0-le-14r3, le 19 mai 2005 à 10:34:19

Ca a l'air marrant ton truc dis moi !! ; ) -- je vis dans un rêve dont je ne me reveille jamais...--

Répondre à m0n0-le-14r3

18

kij_82, le 19 mai 2005 à 10:45:45

Ben ca marche mais j'arrive pas à le mettre en C....
Tant pis, apres faut que je le couple avec mon module C qui appelle le module Perl, et que je fasse un client qui envoie la requete, et le serveur qui lui répond avec le résultat...

Je crois que jamais je n'ai utilisé autant de langage dans un même programme (C / C++ / XS / Perl). Un beau cocktail bien marrant ma fois... ~ iclic @ gauch,iclic,  iclic @ droate, iclic, iclic
             et ya pas de bôg môsieu !    ~

Répondre à kij_82

19

sam3000, le 19 mai 2005 à 10:59:52

Bonjour kij,
j'ai tester ton programme avec un compilateur C (Dev-C++ en mode projet C) et ça compile tres bien
ton probleme viens des lignes (que tu dois supprimer!):

#include <iostream>

#pragma comment(lib, "ws2_32.lib")

using namespace std;


ensuite tu doit inclure dans le LINKER un parametre pour integrer la librairie WinSock2 (dans mon cas c'est "libwsock32.a"), mais ça pourrais etre "ws2_32.lib" pour toi, je ne sait pas! L'erreur est humaine mais un véritable désastre
ne peut être qu'informatique.

Répondre à sam3000

20

kij_82, le 19 mai 2005 à 11:10:38

Oui sam, c'est pour cela que je met :

#pragma comment(lib, "ws2_32.lib")

Ca sert à include la librairie sans changer la config su compilo à la main.

Par contre je suis conscient qu'il faut enlevé
#include <iostream>
using namespace std;


Et c'est ce que j'ai fait mais il me fait les erreurs suivantes (en rajoute stdio.h bine sur avant :
--------------------Configuration: serveur - Win32 Debug--------------------
Compiling...
serveur.c
c:\documents and settings\stvivotn\mes documents\serveur c\autre\serveur.c(23) : error C2275: 'WSADATA' : illegal use of this type as an expression
        c:\program files\microsoft visual studio\vc98\include\winsock2.h(386) : see declaration of 'WSADATA'
c:\documents and settings\stvivotn\mes documents\serveur c\autre\serveur.c(23) : error C2146: syntax error : missing ';' before identifier 'WSAData'
c:\documents and settings\stvivotn\mes documents\serveur c\autre\serveur.c(23) : error C2065: 'WSAData' : undeclared identifier
c:\documents and settings\stvivotn\mes documents\serveur c\autre\serveur.c(24) : warning C4133: 'function' : incompatible types - from 'int *' to 'struct WSAData *'
c:\documents and settings\stvivotn\mes documents\serveur c\autre\serveur.c(25) : error C2275: 'SOCKET' : illegal use of this type as an expression
        c:\program files\microsoft visual studio\vc98\include\winsock2.h(85) : see declaration of 'SOCKET'
c:\documents and settings\stvivotn\mes documents\serveur c\autre\serveur.c(25) : error C2146: syntax error : missing ';' before identifier 'sock'
c:\documents and settings\stvivotn\mes documents\serveur c\autre\serveur.c(25) : error C2065: 'sock' : undeclared identifier
c:\documents and settings\stvivotn\mes documents\serveur c\autre\serveur.c(26) : error C2275: 'SOCKET' : illegal use of this type as an expression
        c:\program files\microsoft visual studio\vc98\include\winsock2.h(85) : see declaration of 'SOCKET'
c:\documents and settings\stvivotn\mes documents\serveur c\autre\serveur.c(26) : error C2146: syntax error : missing ';' before identifier 'csock'
c:\documents and settings\stvivotn\mes documents\serveur c\autre\serveur.c(26) : error C2065: 'csock' : undeclared identifier
c:\documents and settings\stvivotn\mes documents\serveur c\autre\serveur.c(27) : error C2275: 'SOCKADDR_IN' : illegal use of this type as an expression
        c:\program files\microsoft visual studio\vc98\include\winsock2.h(3576) : see declaration of 'SOCKADDR_IN'
c:\documents and settings\stvivotn\mes documents\serveur c\autre\serveur.c(27) : error C2146: syntax error : missing ';' before identifier 'sin'
c:\documents and settings\stvivotn\mes documents\serveur c\autre\serveur.c(27) : error C2065: 'sin' : undeclared identifier
c:\documents and settings\stvivotn\mes documents\serveur c\autre\serveur.c(28) : error C2275: 'SOCKADDR_IN' : illegal use of this type as an expression
        c:\program files\microsoft visual studio\vc98\include\winsock2.h(3576) : see declaration of 'SOCKADDR_IN'
c:\documents and settings\stvivotn\mes documents\serveur c\autre\serveur.c(28) : error C2146: syntax error : missing ';' before identifier 'csin'
c:\documents and settings\stvivotn\mes documents\serveur c\autre\serveur.c(28) : error C2065: 'csin' : undeclared identifier
c:\documents and settings\stvivotn\mes documents\serveur c\autre\serveur.c(32) : error C2224: left of '.sin_addr' must have struct/union type
c:\documents and settings\stvivotn\mes documents\serveur c\autre\serveur.c(33) : error C2224: left of '.sin_family' must have struct/union type
c:\documents and settings\stvivotn\mes documents\serveur c\autre\serveur.c(34) : error C2224: left of '.sin_port' must have struct/union type
Error executing cl.exe.

serveur.obj - 18 error(s), 1 warning(s)



Tu sais quelle include il faut mettre ou comment corriger ce genre d'erreurs.. ?
~ iclic @ gauch,iclic,  iclic @ droate, iclic, iclic
             et ya pas de bôg môsieu !    ~

Répondre à kij_82

21

sam3000, le 19 mai 2005 à 11:31:56

Je cherche encore, mais ton pb viens certainement de l'utilisation de "WSADATA" !!! L'erreur est humaine mais un véritable désastre
ne peut être qu'informatique.

Répondre à sam3000

22

kij_82, le 19 mai 2005 à 11:36:43

Je m'en doute mais bon je vois pas... c'est prise de tête ca, merci de te penché dessus.

++ ~ iclic @ gauch,iclic,  iclic @ droate, iclic, iclic
             et ya pas de bôg môsieu !    ~

Répondre à kij_82

23

Luffy =), le 19 mai 2005 à 12:40:48

Salut kij =)

voilà le code d'une classe que j'avais faite en C++, mais il n'appelle que des fonctions C :

#include <winsock2.h>

#define SERVEUR_CODE 1000
#define SER_ERROR SERVEUR_CODE + 1
#define SER_PORT_INVALIDE SERVEUR_CODE + 2
#define SER_SOCK_ERROR SERVEUR_CODE + 3
#define SER_LISTEN_ERROR SERVEUR_CODE + 4

int CServeur::Executer()
{
	
	if (n_port==0) //on teste le numéro de port
		return SER_PORT_INVALIDE;

//déclaration des variables	

	sockaddr_in client,serveur; //contiendra les infos : IP, famille et le port
	int sock_serveur, sockclient; //n° de sockets
	CString tempon;
	
	sock_serveur = socket(AF_INET,SOCK_STREAM,0); //création du socket
	
	if (sock_serveur==INVALID_SOCKET)
	{
		closesocket(sock_serveur);
		return SER_SOCK_ERROR;
	}

	serveur.sin_family=AF_INET;
	serveur.sin_addr.s_addr=inet_addr("127.0.0.1");
	serveur.sin_port=htons(n_port);

	int ret=bind(sock_serveur,(const sockaddr*)&serveur,sizeof(serveur)); 

	if (ret!=0)
	{
		closesocket(sock_serveur);
		return SER_SOCK_ERROR;
	}

	while (1)
	{
	ret=listen(sock_serveur,SOCK_STREAM); //attente de connexion
	if (ret!=0)
	{
		closesocket(sock_serveur);
		return SER_LISTEN_ERROR;
	}


	int addrlen=sizeof(client); 
	int sock_client=accept(sock_serveur,(sockaddr*)&client, &addrlen);
	if (sock_client==INVALID_SOCKET)
	{
		closesocket(sock_serveur);
		return SER_SOCK_ERROR;
	}

	char buf[256];

	ret=recv(sock_client,buf,sizeof(buf),0);
	if (ret==0)
	{
		closesocket(sock_serveur);
		return SER_ERROR;
	}
	if (ret<255)
		buf[ret+1]=0;
	else
		buf[ret]=0;

	tempon.Format("%s",buf);

	memcpy(buf,"Bienvenue sur Luffy Duck's Serveur !\n\n Veuillez vous identifier :",256);
	send(sock_client,buf,sizeof(buf),0);
	}
	return 0;
}


<edit>
arf je viens de voir qu'il y des CString dans le code... il faudra les remplacer par des char *.
</edit>

bon courage =) Le Parisien, il vaut mieux l'avoir en journal !!! :-P

Répondre à Luffy =)

24

kij_82, le 19 mai 2005 à 13:59:15

.. :) ca devrait allez je crois que je suis de taille pour mes CString !

Merci bien pour le code, j'vais de suite le mettre

++ ~ iclic @ gauch,iclic,  iclic @ droate, iclic, iclic
             et ya pas de bôg môsieu !    ~

Répondre à kij_82

25

kij_82, le 19 mai 2005 à 14:47:21

J'ai essayé ce que tu m'a filer Luffy, j'ai les erreurs suivantes :

Compiling...
serveur.c
c:\documents and settings\stvivotn\mes documents\serveur c\luffy\serveur.c(23) : error C2065: 'sockaddr_in' : undeclared identifier
c:\documents and settings\stvivotn\mes documents\serveur c\luffy\serveur.c(23) : error C2146: syntax error : missing ';' before identifier 'client'
c:\documents and settings\stvivotn\mes documents\serveur c\luffy\serveur.c(23) : error C2065: 'client' : undeclared identifier
c:\documents and settings\stvivotn\mes documents\serveur c\luffy\serveur.c(23) : error C2065: 'serveur' : undeclared identifier
c:\documents and settings\stvivotn\mes documents\serveur c\luffy\serveur.c(24) : error C2143: syntax error : missing ';' before 'type'
c:\documents and settings\stvivotn\mes documents\serveur c\luffy\serveur.c(25) : error C2143: syntax error : missing ';' before 'type'
c:\documents and settings\stvivotn\mes documents\serveur c\luffy\serveur.c(27) : error C2065: 'sock_serveur' : undeclared identifier
c:\documents and settings\stvivotn\mes documents\serveur c\luffy\serveur.c(35) : error C2224: left of '.sin_family' must have struct/union type
c:\documents and settings\stvivotn\mes documents\serveur c\luffy\serveur.c(36) : error C2224: left of '.sin_addr' must have struct/union type
c:\documents and settings\stvivotn\mes documents\serveur c\luffy\serveur.c(37) : error C2224: left of '.siN_PORT' must have struct/union type
c:\documents and settings\stvivotn\mes documents\serveur c\luffy\serveur.c(39) : error C2143: syntax error : missing ';' before 'type'
c:\documents and settings\stvivotn\mes documents\serveur c\luffy\serveur.c(41) : error C2065: 'ret' : undeclared identifier
c:\documents and settings\stvivotn\mes documents\serveur c\luffy\serveur.c(60) : error C2065: 'sockaddr' : undeclared identifier
c:\documents and settings\stvivotn\mes documents\serveur c\luffy\serveur.c(60) : error C2059: syntax error : ')'
c:\documents and settings\stvivotn\mes documents\serveur c\luffy\serveur.c(80) : error C2065: 'tampon' : undeclared identifier
c:\documents and settings\stvivotn\mes documents\serveur c\luffy\serveur.c(80) : error C2224: left of '.Format' must have struct/union type
Error executing cl.exe.

serveur.obj - 16 error(s), 0 warning(s)

Pourtant j'ai inclut winsock2.h, la librairie qu'il faut,... mais il ne me prend pas le sockaddr_in, tu sais pourquoi ? ~ iclic @ gauch,iclic,  iclic @ droate, iclic, iclic
             et ya pas de bôg môsieu !    ~

Répondre à kij_82

29

Luffy =), le 19 mai 2005 à 15:04:00

Ben c chelou, moi ça compile nickel...

et j'ai pas besoin d'inclure une librairie. dans mon .h, j'ai juste l'include de winsock2.h et pis vala.

bizarre tout ça... Le Parisien, il vaut mieux l'avoir en journal !!! :-P

Répondre à Luffy =)

30

kij_82, le 19 mai 2005 à 15:11:26

Ca confirme ce que je pensais.. le compilo qui fait des caprices.. Le matin ca marche toujours bien, l'apres midi ca merde total;.. je revient le matin ca remarche nickel... bref y s'fait trop chier le compilo ! ~ iclic @ gauch,iclic,  iclic @ droate, iclic, iclic
             et ya pas de bôg môsieu !    ~

Répondre à kij_82

31

Luffy =), le 19 mai 2005 à 15:14:46

Demandes à ton chef de taffer à mi-temps ;-)
Le Parisien, il vaut mieux l'avoir en journal !!! :-P

Répondre à Luffy =)

32

kij_82, le 19 mai 2005 à 15:17:24

... c'estd éjà ce que je fais mais faut rien dire... ;) ~ iclic @ gauch,iclic,  iclic @ droate, iclic, iclic
             et ya pas de bôg môsieu !    ~

Répondre à kij_82

33

kij_82, le 20 mai 2005 à 09:17:25

Message à l'intention de Luffy :
Etant un peu plus réveillé ce matin, hopopop j'ai débeugué ce que tu m'a filé, mais il me reste un petit truc que je ne sais pas :
Voilà la version qui marche chez moi (enfin qui marche... qui compile presque) :

#include <stdio.h>
#include <winsock2.h>

#pragma comment(lib, "ws2_32.lib")

#define N_PORT 5000
#define SERVEUR_CODE 1000
#define SER_ERROR SERVEUR_CODE + 1
#define SER_PORT_INVALIDE SERVEUR_CODE + 2
#define SER_SOCK_ERROR SERVEUR_CODE + 3
#define SER_LISTEN_ERROR SERVEUR_CODE + 4


int main ( int argc, char *argv[] ){


	struct sockaddr_in client,serveur; //contiendra les infos : IP, famille et le port
	int sock_serveur, sockclient, ret; //n° de sockets
	char *tampon;

    if (N_PORT==0) //on teste le numéro de port
		return SER_PORT_INVALIDE;

    //déclaration des variables	

	
	
	sock_serveur = socket(AF_INET,SOCK_STREAM,0); //création du socket
	
	if (sock_serveur==INVALID_SOCKET)
	{
		closesocket(sock_serveur);
		return SER_SOCK_ERROR;
	}

	serveur.sin_family=AF_INET;
	serveur.sin_addr.s_addr=inet_addr("127.0.0.1");
	serveur.sin_port=htons(N_PORT);

	ret=bind(sock_serveur,(struct sockaddr *)&serveur,sizeof(serveur)); 

	if (ret!=0)
	{
		closesocket(sock_serveur);
		return SER_SOCK_ERROR;
	}

	while (1)
	{
        char buf[256];
        int addrlen=sizeof(client);
        int sock_client = INVALID_SOCKET;
        
	    ret=listen(sock_serveur,SOCK_STREAM); //attente de connexion
	    if (ret!=0)
	    {
		    closesocket(sock_serveur);
		    return SER_LISTEN_ERROR;
	    }

	    sock_client=accept(sock_serveur,(struct sockaddr*)&client, &addrlen);
	    if (sock_client==INVALID_SOCKET)
	    {
		    closesocket(sock_serveur);
		    return SER_SOCK_ERROR;
	    }

	    

	    ret=recv(sock_client,buf,sizeof(buf),0);
	    if (ret==0)
	    {
		    closesocket(sock_serveur);
		    return SER_ERROR;
	    }
	    if (ret<255)
		    buf[ret+1]='\0';
	    else
		    buf[ret]='\0';

	    tampon.Format("%s",buf);

	    memcpy(buf,"Bienvenue sur Luffy Duck's Serveur !\n\n Veuillez vous identifier :",256);
	    send(sock_client,buf,sizeof(buf),0);
	}
    
	return 0;
}


Juste un dernier truc qui coince pour la compil : c'est sencé faire quoi le ' tampon.Format("%s",buf); ' ? Tu peux me le traduire en C please ? ~ iclic @ gauch,iclic,  iclic @ droate, iclic, iclic
             et ya pas de bôg môsieu !    ~

Répondre à kij_82

34

kij_82, le 20 mai 2005 à 09:22:21

J'vais peut etre dire une connerie mais y sert à rien 'tampon' dans le prog en fait... non ? ~ iclic @ gauch,iclic,  iclic @ droate, iclic, iclic
             et ya pas de bôg môsieu !    ~

Répondre à kij_82

35

kij_82, le 20 mai 2005 à 09:32:18

Bon ben voilà une version du serveur qui fonctionne sous linux / Unix / windows, seuelement il faut changer les include (ou du moins controler l'OS et include les bon inbclude en fonction de l'OS), version corrigée de Luffy :

#include <stdio.h>
#include <winsock2.h>

#pragma comment(lib, "ws2_32.lib")

#define N_PORT 5000
#define SERVEUR_CODE 1000
#define SER_ERROR SERVEUR_CODE + 1
#define SER_PORT_INVALIDE SERVEUR_CODE + 2
#define SER_SOCK_ERROR SERVEUR_CODE + 3
#define SER_LISTEN_ERROR SERVEUR_CODE + 4


int main ( int argc, char *argv[] ){

	struct sockaddr_in client,serveur; //contiendra les infos : IP, famille et le port
	int sock_serveur, ret; //n° de sockets


    if (N_PORT==0) //on teste le numéro de port
		return SER_PORT_INVALIDE;

	sock_serveur = socket(AF_INET,SOCK_STREAM,0); //création du socket
	
	if (sock_serveur==INVALID_SOCKET)
	{
		closesocket(sock_serveur);
		return SER_SOCK_ERROR;
	}

	serveur.sin_family=AF_INET;
	serveur.sin_addr.s_addr=inet_addr("127.0.0.1");
	serveur.sin_port=htons(N_PORT);

	ret=bind(sock_serveur,(struct sockaddr *)&serveur,sizeof(serveur)); 

	if (ret!=0)
	{
		closesocket(sock_serveur);
		return SER_SOCK_ERROR;
	}

	while (1)
	{
        char buf[256];
        int addrlen=sizeof(client);
        int sock_client = INVALID_SOCKET;
        
	    ret=listen(sock_serveur,SOCK_STREAM); //attente de connexion
	    if (ret!=0)
	    {
		    closesocket(sock_serveur);
		    return SER_LISTEN_ERROR;
	    }

	    sock_client=accept(sock_serveur,(struct sockaddr*)&client, &addrlen);
	    if (sock_client==INVALID_SOCKET)
	    {
		    closesocket(sock_serveur);
		    return SER_SOCK_ERROR;
	    }

	    ret=recv(sock_client,buf,sizeof(buf),0);
	    if (ret==0)
	    {
		    closesocket(sock_serveur);
			printf("Erreur %d\n",SER_ERROR);
		    return SER_ERROR;
	    }
	    if (ret<255)
		    buf[ret+1]='\0';
	    else
		    buf[ret]='\0';

	    //tampon.Format("%s",buf);

	    memcpy(buf,"Bienvenue sur Luffy Duck's Serveur !\n\n Veuillez vous identifier :",256);
	    send(sock_client,buf,sizeof(buf),0);
	}
    
	return 0;
}


Ya encore qq amélioration je pense mais un grand merci à Luffy !

++
~ iclic @ gauch,iclic,  iclic @ droate, iclic, iclic
             et ya pas de bôg môsieu !    ~

Répondre à kij_82

26

Canard007, le 19 mai 2005 à 14:55:40

Je sais pas ci cela va t'aider mais j'ai ça dans mes cours:

pour le client:

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <sys/types.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <netdb.h>
#include <unistd.h>

#define PORT 20100

void main()
{
    int sk,addrlen,nbr;
    struct sockaddr_in myaddr;
    char buffer[40];
    struct hostent *host_addr;
    char retour[] = "Message retour du client";

    //creation socket
    if((sk=socket(AF_INET,SOCK_STREAM,0))== -1)
    {
	perror("prog client erreur appel socket");
    }

    host_addr=gethostbyname("localhost");

    myaddr.sin_addr.s_addr=((struct in_addr *)(host_addr->h_addr))->s_addr;
    myaddr.sin_port=PORT;
//    myaddr.sin_port=htons(PORT);
    myaddr.sin_family=AF_INET;

    //demande de connexion
    addrlen=sizeof(struct sockaddr_in);
    if(connect(sk,(struct sockaddr*)&myaddr,addrlen)==-1)
    {
	perror("prog client erreur appel connect");
	return;
    }

    //reception donnees
    if((nbr=read(sk,buffer,40))==-1)
    {
	perror("erreur appel read");
    }
    printf("buffer recu: %s\n",buffer);

    //repond au serveur
    if((nbr=write(sk, retour,strlen(retour)+1))==-1)
    {
	perror("erreur appel write");
    }
    if(close (sk)==-1)
    {
	perror("erreur appel close");
    }
}

COIN!

Répondre à Canard007

27

Canard007, le 19 mai 2005 à 14:56:15

Pour le serveur:

#include <string.h>
#include <stdio.h>
#include <stdlib.h>
#include <sys/types.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <netdb.h>
#include <unistd.h>

#define PORT 20100

void main(void)
{
    int ls,sk,nbr;
    struct sockaddr_in myaddr;
    struct sockaddr_in remaddr;
    char buffer[40];
    unsigned int addrlen;
    char message[]="Message du serveur";

    if (( ls = socket(AF_INET, SOCK_STREAM, 0)) == -1 )
    {
	printf("erreur appel socket");
    }
    memset (&myaddr, 0, sizeof(myaddr));

    myaddr.sin_port = PORT;

    myaddr.sin_family = AF_INET;

    if ( bind(ls,(struct sockaddr*)&myaddr, sizeof(struct sockaddr_in)) == -1)
    {
	perror("erreur bind");
    }

    if ( listen (ls,1) == -1 )
    {
	printf("erreur listen");
    }    
    
    addrlen = sizeof(struct sockaddr_in);

    if (( sk = accept(ls,(struct sockaddr*) &remaddr,&addrlen)) == -1 )
    {
	printf("erreur accept");
    }

    if ( (nbr=write(sk,message,strlen(message)+1)) == -1 )
    {
	printf("erreur write");
    }

    if (( nbr = read(sk,buffer,40)) == -1 )
    {
	printf("erreur read");
    }

    printf("j ai recu :%s \n",buffer);

    close(sk);
    if(close (sk)==-1)
    {
	perror("erreur appel close");
    }

    if(close (ls)==-1)
    {
	perror("erreur appel close");
    }

}


COIN!

Répondre à Canard007

28

kij_82, le 19 mai 2005 à 14:58:54

Merci bien mais c'est une version uniquement linux que tu me donne la, il m'en faudrait une qui fasse WindowNT / Linux( si possible), car version linux j'ai déjà (je travaillais sur mandrake avant), mais au boulot c'est sous NT qu'il le faut alors...
je patauge un peu quoi ! ~ iclic @ gauch,iclic,  iclic @ droate, iclic, iclic
             et ya pas de bôg môsieu !    ~

Répondre à kij_82

36

kij_82, le 20 mai 2005 à 09:44:06

Présentation de mes excuse à canard007, je retire ce que j'ai dit dans le post précédent.
merci bien

++ ~ iclic @ gauch,iclic,  iclic @ droate, iclic, iclic
             et ya pas de bôg môsieu !    ~

Répondre à kij_82

37

sam3000, le 20 mai 2005 à 09:51:45

Pour kij!
ton dernier programme "corrigé" compile bien, mais par contre il NE FAIT RIEN!
tu es sur que ça fonctionne pour toi?? L'erreur est humaine mais un véritable désastre
ne peut être qu'informatique.

Répondre à sam3000

38

kij_82, le 20 mai 2005 à 10:00:25

Oui, je viens de m'en apercevoir... lol (fais ch...)

Il met le message suivant :

erreur creation socket serveur !


J'ai modifié encore un peu le code, si tu vois d'ou ca peut venir :
#include <stdio.h>
#include <winsock2.h>

#pragma comment(lib, "ws2_32.lib")

#define N_PORT 5000
#define SERVEUR_CODE 1000
#define SER_ERROR SERVEUR_CODE + 1
#define SER_PORT_INVALIDE SERVEUR_CODE + 2
#define SER_SOCK_ERROR SERVEUR_CODE + 3
#define SER_LISTEN_ERROR SERVEUR_CODE + 4


int main ( int argc, char *argv[] ){

	struct sockaddr_in client,serveur; //contiendra les infos : IP, famille et le port
	int sock_serveur, ret; //n° de sockets


    if (N_PORT==0) //on teste le numéro de port
		return SER_PORT_INVALIDE;

	//création de la socket serveur :
	
	if ( (sock_serveur = socket(AF_INET,SOCK_STREAM,0)) == -1 )
	{
		printf("Probleme a la creation de la socket serveur !\n");
		exit(0);
	}

	serveur.sin_family=AF_INET;
	serveur.sin_addr.s_addr=inet_addr("127.0.0.1");
	serveur.sin_port=htons(N_PORT);


	if ( bind(sock_serveur,(struct sockaddr *)&serveur,sizeof(serveur)) != 0)
	{
		closesocket(sock_serveur);
		return SER_SOCK_ERROR;
	}

	// Mise a l ecoute :
	if ( listen(sock_serveur,SOCK_STREAM) != 0)
	{
		printf("Impossible d ecouter sur le port designe !\n");
		closesocket(sock_serveur);
		exit(SER_LISTEN_ERROR);
	}

	while (1)
	{
        char buf[256];
        int addrlen=sizeof(client);
        int sock_client = INVALID_SOCKET;

	    sock_client=accept(sock_serveur,(struct sockaddr*)&client, &addrlen);
	    if (sock_client==INVALID_SOCKET)
	    {
		    closesocket(sock_serveur);
		    return SER_SOCK_ERROR;
	    }

	    ret=recv(sock_client,buf,sizeof(buf),0);
	    if (ret==0)
	    {
		    closesocket(sock_serveur);
			printf("Erreur %d\n",SER_ERROR);
		    return SER_ERROR;
	    }
	    if (ret<255)
		    buf[ret+1]='\0';
	    else
		    buf[ret]='\0';

	    //tampon.Format("%s",buf);

	    memcpy(buf,"Bienvenue sur Luffy Duck's Serveur !\n\n Veuillez vous identifier :",256);
	    send(sock_client,buf,sizeof(buf),0);
	}
    
	return 0;
}


C'est à ce niveau ci :
if ( (sock_serveur = socket(AF_INET,SOCK_STREAM,0)) == -1 )
	{
		printf("Probleme a la creation de la socket serveur !\n");
		exit(0);
	}



++ ~ iclic @ gauch,iclic,  iclic @ droate, iclic, iclic
             et ya pas de bôg môsieu !    ~

Répondre à kij_82

39

Luffy =), le 20 mai 2005 à 14:27:44

Salut kij :-)

sous windows, il faut parfois rajouter ce bout de code (me demande pas pourquoi, mais des fois ça marche sans !!! c'est windows quoi !) :

WSADATA initialisation_win32;
	ret=WSAStartup(MAKEWORD(2,2),&initialisation_win32);
	if (ret!=0)
		printf("\nDesole, je ne peux pas initialiser Winsock du a l'erreur : %d %d",ret,WSAGetLastError());
	else
		printf("\nWSAStartup  : OK");

++ Le Parisien, il vaut mieux l'avoir en journal !!! :-P

Répondre à Luffy =)