6 réponses
loomchild
Messages postés
6
Date d'inscription
mardi 23 septembre 2003
Statut
Membre
Dernière intervention
17 septembre 2004
6
21 nov. 2003 à 15:54
21 nov. 2003 à 15:54
bonjour,
bon, j'ai cherche un petit moment, mon programme
refusant de fonctionner pour des problemes de WinSock.
ne les ayant pas resolus, je ne peux pas t'assurer d'avoir
trouve ton probleme. Neanmoins, je te propose une version
corrigee, n'utilisant pas de globales, correctement indentee,
et faisant quelques tests d'erreur judicieux par-ci par-la.
Je pense que ton probleme vient en grande partie du fait
que ta variable Buffer n'est pas allouée (oups!!).
Voila ma version, j'espere que le probleme venait bien de la.
#include<winsock2.h>
#include<process.h>
#include<sys/types.h>
#include<stdlib.h>
#include<stdio.h>
#pragma comment(lib, "ws2_32.lib")
struct abc
{
int a;
float b;
};
#define MAX_BUFSIZE 256
int main(void)
{
int x, z, addrlen;
int descripteur;
char *Buffer;
struct sockaddr_in evette;
WSADATA WSAData;
Buffer = malloc(MAX_BUFSIZE);
if (WSAStartup(MAKEWORD(2,0), &WSAData) != 0) /* 2 lignes ajouter trouver sur le forum CCM */
{
puts("WSAStartup: could not find a usable WinSock DLL!");
return 1;
}
if (LOBYTE(WSAData.wVersion) != 0 || HIBYTE(WSAData.wVersion) != 2)
{
puts("WSAStartup: could not find a usable WinSock DLL!");
WSACleanup( );
return 1;
}
evette.sin_family = AF_INET;
evette.sin_addr.s_addr = (inet_addr("192.168.0.1"));
evette.sin_port = htons(24);
descripteur = socket(AF_INET, SOCK_STREAM, 0);
if (descripteur == -1)
{
perror("socket");
return 1;
}
if (bind(descripteur, (struct sockaddr*)&evette, sizeof(evette)) == -1)
{
perror("bind");
return 1;
}
if (listen(descripteur, 10) == -1)
{
perror("listen");
return 1;
}
printf("%d\n", descripteur);
while (1 + 1 == 2)
{
addrlen = sizeof(struct sockaddr_in);
x = accept(descripteur, (struct sockaddr*)&evette, &addrlen);
printf("%d\n", x);
z = recv(descripteur, Buffer, sizeof(Buffer), 0);
printf("%c\n", Buffer);
send(descripteur, Buffer, sizeof(Buffer), 0);
}
closesocket(descripteur);
/* printf("%d", x); */
free(Buffer);
WSACleanup();
return 0;
}
tu remarqueras aussi que je n'utilise qu'une variable de type
struct sockaddr_in.
pour plus d'infos, et un code source qui marche (en tout cas
sous unix):
http://www.linuxgazette.com/issue47/bueno.html
--
Loomchild - ecchi nano wa ikeru to omoimasu
bon, j'ai cherche un petit moment, mon programme
refusant de fonctionner pour des problemes de WinSock.
ne les ayant pas resolus, je ne peux pas t'assurer d'avoir
trouve ton probleme. Neanmoins, je te propose une version
corrigee, n'utilisant pas de globales, correctement indentee,
et faisant quelques tests d'erreur judicieux par-ci par-la.
Je pense que ton probleme vient en grande partie du fait
que ta variable Buffer n'est pas allouée (oups!!).
Voila ma version, j'espere que le probleme venait bien de la.
#include<winsock2.h>
#include<process.h>
#include<sys/types.h>
#include<stdlib.h>
#include<stdio.h>
#pragma comment(lib, "ws2_32.lib")
struct abc
{
int a;
float b;
};
#define MAX_BUFSIZE 256
int main(void)
{
int x, z, addrlen;
int descripteur;
char *Buffer;
struct sockaddr_in evette;
WSADATA WSAData;
Buffer = malloc(MAX_BUFSIZE);
if (WSAStartup(MAKEWORD(2,0), &WSAData) != 0) /* 2 lignes ajouter trouver sur le forum CCM */
{
puts("WSAStartup: could not find a usable WinSock DLL!");
return 1;
}
if (LOBYTE(WSAData.wVersion) != 0 || HIBYTE(WSAData.wVersion) != 2)
{
puts("WSAStartup: could not find a usable WinSock DLL!");
WSACleanup( );
return 1;
}
evette.sin_family = AF_INET;
evette.sin_addr.s_addr = (inet_addr("192.168.0.1"));
evette.sin_port = htons(24);
descripteur = socket(AF_INET, SOCK_STREAM, 0);
if (descripteur == -1)
{
perror("socket");
return 1;
}
if (bind(descripteur, (struct sockaddr*)&evette, sizeof(evette)) == -1)
{
perror("bind");
return 1;
}
if (listen(descripteur, 10) == -1)
{
perror("listen");
return 1;
}
printf("%d\n", descripteur);
while (1 + 1 == 2)
{
addrlen = sizeof(struct sockaddr_in);
x = accept(descripteur, (struct sockaddr*)&evette, &addrlen);
printf("%d\n", x);
z = recv(descripteur, Buffer, sizeof(Buffer), 0);
printf("%c\n", Buffer);
send(descripteur, Buffer, sizeof(Buffer), 0);
}
closesocket(descripteur);
/* printf("%d", x); */
free(Buffer);
WSACleanup();
return 0;
}
tu remarqueras aussi que je n'utilise qu'une variable de type
struct sockaddr_in.
pour plus d'infos, et un code source qui marche (en tout cas
sous unix):
http://www.linuxgazette.com/issue47/bueno.html
--
Loomchild - ecchi nano wa ikeru to omoimasu
Merci,
ça marche toujours pas, mais ça avance.
avec ton programme, j'ai l'erreur "WSAStartup: could not find a usable WinSock DLL!" si je reutilise mon WSAStartup, je n'ai pas d'erreur, mais toujours le meme probleme de recv.
ça marche toujours pas, mais ça avance.
avec ton programme, j'ai l'erreur "WSAStartup: could not find a usable WinSock DLL!" si je reutilise mon WSAStartup, je n'ai pas d'erreur, mais toujours le meme probleme de recv.
j'avais à peu prêt les mêmes problèmes, j'ai simplifié le programme, repensé... ça marche avec celui ci:
// LE SERVEUR
// serveur.cpp
#include <iostream>
#include <stdlib.h>
#include <winsock.h>
#include <string.h>
//il faut que le numéro du port soit le même que celui du client
#define PORT 789 // Port arbitraire de communication
void main()
{
cout << "Serveur pret." << endl;
//déclarations et initialisation de du socket
WORD wVersionRequested;
WSADATA wsaData;
wVersionRequested = MAKEWORD(1, 1);
WSAStartup(wVersionRequested, &wsaData);
//création du socket (appelé "s")
SOCKET s;
s = socket(AF_INET,SOCK_STREAM,0);
//paramètres du socket sous forme d'objets
struct sockaddr_in sain;
sain.sin_family = AF_INET;
sain.sin_port = htons(PORT);
sain.sin_addr.s_addr = INADDR_ANY;
bind(s, (struct sockaddr *) &sain, sizeof(struct sockaddr_in));
//écoute des clients (bloque le programme tant qu'il n'y a pas de client)
listen(s, 5);
cout << "En attente de connection." << endl;
//création du socket qui correspond au client
SOCKET ns;
struct sockaddr_in fsain;
int fromlen = sizeof(struct sockaddr_in);
ns = accept(s,(struct sockaddr *) &fsain, &fromlen);
cout << "Connection avec le client etablie." << endl;
//déclarations du buffer de réception...
char buffer[64];
int rec;
do
{
//réception
rec = recv(ns,buffer,64*sizeof(char),0);
buffer[rec] = '\0' ;
cout << buffer << endl;
printf("%d",buffer);
memset(buffer, 0, 64*sizeof(char)); //affichage des données reçues
}while(rec>0); //sort de la boucle lorsque le client a fini d'émettre
cout << "Connection fermee par le client" << endl;
//fermeture du socket et initialisation par défaut
closesocket(s);
WSACleanup();
cout << endl ;
}
// LE CLIENT
// client.cpp
#include <iostream>
#include <stdlib.h>
#include <winsock.h>
#include <string.h>
#include <except.h>
#include <stdio.h>
#include <math.h>
#define PORT 789 // même port que le serveur
void main()
{
cout << "Client pret." << endl;
//déclarations et initialisation de du socket
WORD wVersionRequested;
WSADATA wsaData;
wVersionRequested = MAKEWORD(1, 1);
WSAStartup(wVersionRequested, &wsaData);
//création du socket (appelé "s")
SOCKET s;
s = socket(AF_INET,SOCK_STREAM,0);
cout << "SOCKET : " << s << endl;
//paramètres du socket sous forme d'objets
struct sockaddr_in sain;
sain.sin_family = AF_INET;
sain.sin_port = htons(PORT);
//adresse du serveur
sain.sin_addr.s_addr = inet_addr("123.123.129.48");
//connection au serveur par le socket "s"
connect(s, (struct sockaddr *) &sain, sizeof(sain));
cout << "Client connecte au serveur." << endl;
char *message = "coucou, ca marche!!!!";
char message[80];
//envoie de données au serveur 3000 fois
for (i=1 ; i<=3000 ; i++)
{
send(s, message, strlen(message), 0);
}
//fermeture du socket et initialisation par défaut
closesocket(s);
WSACleanup();
}
// LE SERVEUR
// serveur.cpp
#include <iostream>
#include <stdlib.h>
#include <winsock.h>
#include <string.h>
//il faut que le numéro du port soit le même que celui du client
#define PORT 789 // Port arbitraire de communication
void main()
{
cout << "Serveur pret." << endl;
//déclarations et initialisation de du socket
WORD wVersionRequested;
WSADATA wsaData;
wVersionRequested = MAKEWORD(1, 1);
WSAStartup(wVersionRequested, &wsaData);
//création du socket (appelé "s")
SOCKET s;
s = socket(AF_INET,SOCK_STREAM,0);
//paramètres du socket sous forme d'objets
struct sockaddr_in sain;
sain.sin_family = AF_INET;
sain.sin_port = htons(PORT);
sain.sin_addr.s_addr = INADDR_ANY;
bind(s, (struct sockaddr *) &sain, sizeof(struct sockaddr_in));
//écoute des clients (bloque le programme tant qu'il n'y a pas de client)
listen(s, 5);
cout << "En attente de connection." << endl;
//création du socket qui correspond au client
SOCKET ns;
struct sockaddr_in fsain;
int fromlen = sizeof(struct sockaddr_in);
ns = accept(s,(struct sockaddr *) &fsain, &fromlen);
cout << "Connection avec le client etablie." << endl;
//déclarations du buffer de réception...
char buffer[64];
int rec;
do
{
//réception
rec = recv(ns,buffer,64*sizeof(char),0);
buffer[rec] = '\0' ;
cout << buffer << endl;
printf("%d",buffer);
memset(buffer, 0, 64*sizeof(char)); //affichage des données reçues
}while(rec>0); //sort de la boucle lorsque le client a fini d'émettre
cout << "Connection fermee par le client" << endl;
//fermeture du socket et initialisation par défaut
closesocket(s);
WSACleanup();
cout << endl ;
}
// LE CLIENT
// client.cpp
#include <iostream>
#include <stdlib.h>
#include <winsock.h>
#include <string.h>
#include <except.h>
#include <stdio.h>
#include <math.h>
#define PORT 789 // même port que le serveur
void main()
{
cout << "Client pret." << endl;
//déclarations et initialisation de du socket
WORD wVersionRequested;
WSADATA wsaData;
wVersionRequested = MAKEWORD(1, 1);
WSAStartup(wVersionRequested, &wsaData);
//création du socket (appelé "s")
SOCKET s;
s = socket(AF_INET,SOCK_STREAM,0);
cout << "SOCKET : " << s << endl;
//paramètres du socket sous forme d'objets
struct sockaddr_in sain;
sain.sin_family = AF_INET;
sain.sin_port = htons(PORT);
//adresse du serveur
sain.sin_addr.s_addr = inet_addr("123.123.129.48");
//connection au serveur par le socket "s"
connect(s, (struct sockaddr *) &sain, sizeof(sain));
cout << "Client connecte au serveur." << endl;
char *message = "coucou, ca marche!!!!";
char message[80];
//envoie de données au serveur 3000 fois
for (i=1 ; i<=3000 ; i++)
{
send(s, message, strlen(message), 0);
}
//fermeture du socket et initialisation par défaut
closesocket(s);
WSACleanup();
}
escusez moi, c'est pas en C, c'est en c++, vous avez sans doute vu... ça marche chez moi, dite mloi si ça marche chez vous!
Vous n’avez pas trouvé la réponse que vous recherchez ?
Posez votre question
salut
certaines personnes ont tendance a ne plus bosser et a se servir de l'internet pour cherche des plats tout chauds, mets intellectuels penser par de vrais programmeurs( enfin, pas non plus des veritables..)
dans ts ce ke je vois, nulle part je lis la veritable consigne a respecter lors de la programmation de client/ serveur
>>>TCP/UDP ou TCP/IP>>>H.C ou C???
a bons entendeurs salut
abdel
certaines personnes ont tendance a ne plus bosser et a se servir de l'internet pour cherche des plats tout chauds, mets intellectuels penser par de vrais programmeurs( enfin, pas non plus des veritables..)
dans ts ce ke je vois, nulle part je lis la veritable consigne a respecter lors de la programmation de client/ serveur
>>>TCP/UDP ou TCP/IP>>>H.C ou C???
a bons entendeurs salut
abdel
salut,
c'est clair, c'est du bricolage, j'assume, mais au moins ça marche pour moi en tout cas : mon objectif été de transmettre des données par le réseau. Ces programmes le permettent, ça me convient. Je ne suis pas programmeur, mais utilisateur de programmes...nuances.
Ceci dit, c'est à prendre ou à laisser, je le met à disposition, à vous d'en prendre ce qui vous interresse.
bonne journée
c'est clair, c'est du bricolage, j'assume, mais au moins ça marche pour moi en tout cas : mon objectif été de transmettre des données par le réseau. Ces programmes le permettent, ça me convient. Je ne suis pas programmeur, mais utilisateur de programmes...nuances.
Ceci dit, c'est à prendre ou à laisser, je le met à disposition, à vous d'en prendre ce qui vous interresse.
bonne journée