Probleme socket en C

char snipeur -  
 asterix -
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.

6 réponses

  1. loomchild Messages postés 6 Statut Membre 6
     
    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
    0
  2. char snipeur
     
    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.
    0
  3. asterix
     
    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();
    }
    0
  4. asterix
     
    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!
    0
  5. Vous n’avez pas trouvé la réponse que vous recherchez ?

    Posez votre question
  6. abdelhak
     
    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
    0
  7. asterix
     
    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
    0