Rechercher : dans
Par :

Probleme socket en C

Dernière réponse le 3 déc 2003 à 12:35:51 char snipeur, le 20 nov 2003 à 21:50:17 
 Signaler ce message aux modérateurs

Bonjour,
J'ai probleme avec le code suivant :


#include<stdio.h>
#include<winsock2.h>
#include<process.h>
#pragma comment(lib, "ws2_32.lib")
//#include <sys/socket.h>
//public CWinApp{};

int x,y,z,k,j;
SOCKET descripteur,soc;
char *Buffer;
float a,b;
struct sockaddr_in evette,apelant;
struct abc{int a; float b;};
struct abc ab;
void main(){
WSADATA WSAData;
WSAStartup(MAKEWORD(2,0), &WSAData); // 2 lignes ajouter trouver sur le forum CCM
evette.sin_family = AF_INET; /* Protocole internet */
evette.sin_addr.s_addr =(inet_addr("192.168.0.1"));//htonl(INADDR_ANY); // /* Toutes les adresses IP de la station */
evette.sin_port = htons(24); /* port d'écoute par défaut au dessus des ports réservés (si ligne supprimer) */
descripteur = socket(AF_INET,SOCK_STREAM,0);
z=bind(descripteur,(struct sockaddr*)&evette,sizeof(evette));
k=listen(descripteur,10);
if (k == SOCKET_ERROR) {
printf("ba c une belle merde \n");
}
printf("%d %d %d\n",descripteur,z,k); while (1+1==2){
j=sizeof(apelant);
x=accept(descripteur,(struct sockaddr*)&apelant, &j);
printf("%d\n",x);
z=recv(descripteur,Buffer,sizeof(Buffer),0 );
printf("%c\n",Buffer);
send(descripteur,Buffer,sizeof(Buffer),0 ); }
x=closesocket(soc);
printf("%d",x);
WSACleanup();
}


aparemment, ça marche jusqu'au "accept" mais aprés ça s'arrete.
lorsque je fait un telnet le prog lancer, j'arrive bien à me connecter, mais apres j'ai l'impression qu'il ne se passe plus rien. Je n'ai pas d'echo, ni rien.

Meilleures réponses pour « probleme socket en C » dans :
La compilation et les modules en C et en C++ VoirCet article a pour vocation d'introduire les notions de bases de la compilation en C et en C++ et de la programmation modulaire. Il permet de mieux comprendre les messages d'erreur du compilateur. Les notions abordées ici sont indépendantes du...
[Langage C] C/C++ Erreur de segmentation VoirQu'est ce qu'une erreur de segmentation Vous êtes en train de développer une application sous Linux en C/C++. Tout va bien, ça compile, les oiseaux chantent. Donc vous lancez votre application pour la tester. Et vous obtenez l'un de ces deux...
Compiler du C sous Linux/UNIX VoirSous Linux, le compilateur de C est gcc. Il est installé de base sur plusieurs distributions, mais sur Debian (et celles qui en découlent) il faudra l'installer (aptitude install gcc). gcc Syntaxe de GCC gcc Tout d'abord, il faut savoir...
Télécharger Visual C++ Express VoirVisual C++ Express est une version "gratuite" et allégée de Visual Studio ; l'utilisation requiert l'inscription sur le site de Microsoft. Cet environnement de développement permet de créer des application Win32 ou du .NET C.
Programmation réseau - Les sockets VoirIntroduction aux sockets La notion de sockets a été introduite dans les distributions de Berkeley (un fameux système de type UNIX, dont beaucoup de distributions actuelles utilisent des morceaux de code), c'est la raison pour laquelle on parle...
Les fonctions de l'API Socket VoirLes fonctions des sockets en détail La fonction socket() La création d'un socket se fait grâce à la fonction socket() : int socket(famille,type,protocole) famille représente la famille de protocole utilisé (AF_INET pour TCP/IP utilisant une...
Langage C++ - Les types de données VoirLes types de données Les données manipulées en langage C++, comme en langage C, sont typées, c'est-à-dire que pour chaque donnée que l'on utilise (dans les variables par exemple) il faut préciser le type de donnée, ce qui permet de connaître...

1

loomchild, le 21 nov 2003 à 15:54:35

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

Répondre à loomchild

2

char snipeur, le 24 nov 2003 à 11:26:46

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.

Répondre à char snipeur

3

asterix, le 3 déc 2003 à 10:39:42

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();
}

Répondre à asterix

4

asterix, le 3 déc 2003 à 10:44:41

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!

Répondre à asterix

5

abdelhak, le 3 déc 2003 à 11:08:21

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

Répondre à abdelhak

6

 asterix, le 3 déc 2003 à 12:35:51

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

Répondre à asterix
Collection CommentÇaMarche.net