[C] socket [Résolu]

Signaler
Messages postés
2448
Date d'inscription
samedi 21 février 2004
Statut
Modérateur
Dernière intervention
29 janvier 2010
-
Messages postés
3212
Date d'inscription
lundi 7 novembre 2005
Statut
Membre
Dernière intervention
16 février 2009
-
bonjour ,
j'essai de me faire une sorte de lib client dans un premier temps pour utiliser les socket mais avec mon code je ne peut me connecter null part , il me renvoi connection echouee :

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


int initwinsock(void)
{
    WORD wVersionRequested;
    WSADATA wsaData;
    int err;
    wVersionRequested = MAKEWORD( 2, 0 );
    err = WSAStartup( wVersionRequested, &wsaData );
    if ( err != 0 )
    {
        return SOCKET_ERROR; //impossible de charger winsock.dll
    }
    //-- Ceci permet de vérifier que Winsock supporte bien la version 2.0 --//
    if ( LOBYTE( wsaData.wVersion ) != 2 || HIBYTE( wsaData.wVersion ) != 0 )
    {
        WSACleanup();
        return SOCKET_ERROR; //impossible de charger winsock.dll
    }
    else
    {
        return 1; //Winsock.dll succefully initialised
    }
}


SOCKET * initSocketOn(struct sockaddr_in *sin)
{
    SOCKET * sock = socket(AF_INET,SOCK_STREAM,0);


    int erreur = connect(sock, (struct sockaddr *)&sin,sizeof(struct sockaddr));
    if(erreur ==SOCKET_ERROR)
        return -1;


    return sock;
}
struct sockaddr_in *  initSocketInfo(char * host , int port)
{


    struct sockaddr_in  *sin =NULL;
    sin = malloc(sizeof(struct sockaddr_in  *));
    sin->sin_family = AF_INET;
    sin->sin_port = htons(port);
    sin->sin_addr.s_addr=inet_addr(host);
    memset (sin->sin_zero, 0, 8);
    return sin;
}
char * readSock(SOCKET * sock , int buffer)
{
    char *buf =NULL;
    buf = malloc(sizeof(char)*buffer);


    int erreur = recv(sock,(char*)buf,buffer,0);
    return buf;
}
int main()
{
    int init = initwinsock();
    printf("winsock = %d\n",init);
    struct sockaddr_in *sin =NULL;
    sin =  malloc(sizeof(struct sockaddr_in*));
    sin = initSocketInfo("127.0.0.1",8189);


    SOCKET * sock =NULL;
    sock = malloc(sizeof(SOCKET));
    sock = initSocketOn(&sin);
    if(sock ==-1)
        printf("connection echouee\n");


    printf("%s\n",readSock(sock,1024));
}

voila merci d'avance

ps : j'ai lu les man et cherche de la doc mais rien ne precise l'erreur
de plus l'hote et le port son bons

"n'est pas mort ce qui semble a jamais dormir et en d'etrange temps meme la mort peut mourrir"

12 réponses

Messages postés
3212
Date d'inscription
lundi 7 novembre 2005
Statut
Membre
Dernière intervention
16 février 2009
15
Fonction d'initialisation:

void init (void)
{
    WSADATA WSAData;
    WSAStartup(MAKEWORD(2,0), &WSAData);
}

// On initialise et connect le socket
void initSocket (char *addr, int port, SOCKET *sock, SOCKADDR_IN *sin)
{
    sin.sin_addr.s_addr    = inet_addr(addr);
    sin.sin_family        = AF_INET;
    sin.sin_port        = htons(port);
    sock = socket(AF_INET,SOCK_STREAM,0);
    bind(sock, (SOCKADDR *)sin, sizeof(SOCKADDR_IN));
    connect(sock, (SOCKADDR *)sin, sizeof(SOCKADDR_IN));
}

void closeSocket (SOCKET sock)
{
    closesocket(sock);
    WSACleanup();
}

int main ()
{
    SOCKET sock;
    SOCKADDR_IN sin;
    char *buffer = (char*)malloc(1024);

    init();
    initSocket("127.0.0.1", 8189, &sock, &sin);

    recv(sock, buffer, 1024, 0);
    printf("%s\n", buffer);

    free(buffer);

    closeSocket(sock);
    return 0;
}

Essais ça.

___________________________________________
Les plus grands esprits trouvent toujours une solution
Messages postés
3212
Date d'inscription
lundi 7 novembre 2005
Statut
Membre
Dernière intervention
16 février 2009
15
AHHHHHHH je me suis encore tompé. C'est comme ça quand on fait 2 choses en même temps:

void initSocket (char *addr, int port, SOCKET *sock, SOCKADDR_IN *sin)
{
    sin->sin_addr.s_addr    = inet_addr(addr);
    sin->sin_family        = AF_INET;
    sin->sin_port        = htons(port);
    *sock = socket(AF_INET,SOCK_STREAM,0);
    bind(*sock, (SOCKADDR *)sin, sizeof(SOCKADDR_IN));
    connect(*sock, (SOCKADDR *)sin, sizeof(SOCKADDR_IN));
}

___________________________________________
Les plus grands esprits trouvent toujours une solution
Messages postés
3212
Date d'inscription
lundi 7 novembre 2005
Statut
Membre
Dernière intervention
16 février 2009
15
sin = malloc(sizeof(struct sockaddr_in  *)); ?????
Tu fait un malloc sans free. Le genre de fonction comme readSock est à évité il faut plutot faire:

int readSock(SOCKET * sock , char* buffer)
{
    int erreur = recv(sock,(char*)buf,buffer,0);

    return erreur
}

et allouer la mémoire à l'exterieure

char *buffer = (char*)malloc(1024);

readSock(sock, &buffer);
printf("%s\n",buffer);

free(buffer);

Je regarde encore un peu.

___________________________________________
Les plus grands esprits trouvent toujours une solution
Messages postés
3212
Date d'inscription
lundi 7 novembre 2005
Statut
Membre
Dernière intervention
16 février 2009
15
Bon ok je vien de comprend le fonctionnement de ta fonction

int readSock(SOCKET * sock , char* buffer, int size)
{
    int erreur = recv(sock, buffer ,size,0);
    return erreur;
}

Ensuite:
sin =  malloc(sizeof(struct sockaddr_in*));???? Pourquoi ???????

___________________________________________
Les plus grands esprits trouvent toujours une solution
Messages postés
2448
Date d'inscription
samedi 21 février 2004
Statut
Modérateur
Dernière intervention
29 janvier 2010
15
ben on allou toujours de la memoire au pointeur non?
si je ne le fait pas j'ai un seg fault

sinon pourquoi ma fonction est a evité ?

"n'est pas mort ce qui semble a jamais dormir et en d'etrange temps meme la mort peut mourrir"
Messages postés
3212
Date d'inscription
lundi 7 novembre 2005
Statut
Membre
Dernière intervention
16 février 2009
15
Tu ne libère pas ta mémoire:

Tien je t'ai fait une sorte de tuto pour t'aider un peu:

int main()
{
    char* buffer;
    SOCKET sock;
    SOCKADDR_IN sin;
    WSADATA WSAData;

    // Initialisation simple
    WSAStartup(MAKEWORD(2,0), &WSAData);

    sin.sin_addr.s_addr    = inet_addr("127.0.0.1");
    sin.sin_family        = AF_INET;
    sin.sin_port        = htons(8189);

    // On créé le socket
    sock = socket(AF_INET,SOCK_STREAM,0);

    // On attache le socket au port
    bind(sock, (SOCKADDR *)&sin, sizeof(sin));

    // Bon ton socket ici est bien initialisé alors on se connect
    connect(sock, (SOCKADDR *)&sin, sizeof(sin));

    // On alloue assé de memoire pour 1024 char
    buffer = (char*)malloc(1024);

    // On recois les données
    recv(sock, buffer, sizeof(buffer), 0);

    printf("%s\n", buffer);

    // N'OUBLIE JAMAIS DE LIBÉRER TA MÉMOIRE
    free(buffer);

    return 0;
}

Ici c'est sûr que tu ne recevra jamais rien car tu na rien envoyer sur ton port.

___________________________________________
Les plus grands esprits trouvent toujours une solution
Messages postés
3212
Date d'inscription
lundi 7 novembre 2005
Statut
Membre
Dernière intervention
16 février 2009
15
Il manque
<tt><tt>closesocket(sock);
WSACleanup();

avant le return 0 pour bien fermer le port.
</tt></tt>

___________________________________________
Les plus grands esprits trouvent toujours une solution
Messages postés
2448
Date d'inscription
samedi 21 février 2004
Statut
Modérateur
Dernière intervention
29 janvier 2010
15
merci beaucoup pour l'explication
mais ce que je voudrais c'est justement faire des fonction qui permettrais d'eviter a chaque fois ce cheminement
et en simplifiant l'utilisation des socket
c'est pour cela que je ne veux pas faire comme toi

merci quand meme ;)

"n'est pas mort ce qui semble a jamais dormir et en d'etrange temps meme la mort peut mourrir"
Messages postés
3212
Date d'inscription
lundi 7 novembre 2005
Statut
Membre
Dernière intervention
16 février 2009
15
Oups correction d'ine fonction:

void initSocket (char *addr, int port, SOCKET *sock, SOCKADDR_IN *sin)
{
    sin->sin_addr.s_addr    = inet_addr(addr);
    sin->sin_family        = AF_INET;
    sin->sin_port        = htons(port);
    *sock = socket(AF_INET,SOCK_STREAM,0);
    bind(sock, (SOCKADDR *)sin, sizeof(SOCKADDR_IN));
    connect(sock, (SOCKADDR *)sin, sizeof(SOCKADDR_IN));
}

___________________________________________
Les plus grands esprits trouvent toujours une solution
Messages postés
2448
Date d'inscription
samedi 21 février 2004
Statut
Modérateur
Dernière intervention
29 janvier 2010
15
merci bcp je teste ^^

"n'est pas mort ce qui semble a jamais dormir et en d'etrange temps meme la mort peut mourrir"
Messages postés
2448
Date d'inscription
samedi 21 février 2004
Statut
Modérateur
Dernière intervention
29 janvier 2010
15
ca marche impec

ce n'est pas a ca que je comptais arriver comme structure mais ca m'iras le temps que j'apprenne a manipuler les socket

merci bcp

"n'est pas mort ce qui semble a jamais dormir et en d'etrange temps meme la mort peut mourrir"
Messages postés
3212
Date d'inscription
lundi 7 novembre 2005
Statut
Membre
Dernière intervention
16 février 2009
15
Tuto très simple:
http://c.developpez.com/WalrusSock/
Exelent tuto. Beaucoup plus poussé(en anglais):
http://betouchi.free.fr/doc_et_ebook/prog_reseau/network2.chm

___________________________________________
Les plus grands esprits trouvent toujours une solution