IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Windows Discussion :

thread sous windows


Sujet :

Windows

Mode arborescent

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre averti
    Profil pro
    Inscrit en
    Avril 2007
    Messages
    28
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2007
    Messages : 28
    Par défaut thread sous windows
    salut

    Voila mon probleme: j'ai essayer de réer un tchat, d'abord le client envoie un message au serveur, puis plusieurs, puis le serveur répond, et enfin les deux ensembles. Or là problème: le serveur envoie 100 message (de salut0 à salut100) puis un 101° qui est "esc" et le client est chargé de récuperer tout les message jusqu'à ce quil trouve "esc". lorsque je fait une boucle de recv() directement dans le main, pas de problème. Mais lorsque je fait un thread, il reçoit plus rien.
    j'ai d'abord pensé que ça pouvait venir de la console, alors la reception se fait dans un fichier appelé conv.txt.

    Voici ce code:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
    106
    107
    108
    109
    110
    111
    112
    113
    #include <stdio.h>
    #include <stdlib.h>
    #include <winsock2.h>
    #include <time.h>
    #include <string.h>
    #include <windows.h>
    
    void wsa_start();
    void connecter(SOCKADDR_IN *info_source, SOCKET socket);
    void envoyer(SOCKET socket);
    unsigned long WINAPI recevoir(void* socket);
    
    int main(int argc, char *argv[])
    { 
    
    wsa_start();
    
    SOCKET socket_perso = socket(AF_INET, SOCK_STREAM, 0);
    printf("socket = %ld (!invalid socket = bon)\n", socket_perso);
    
    char ip[16];
    printf("ip ?\n");
    fgets(ip, 16, stdin);
    
    SOCKADDR_IN info_source;
                info_source.sin_family = AF_INET;
                info_source.sin_addr.s_addr = inet_addr(ip);
                info_source.sin_port = htons(80);
    connecter(&info_source, socket_perso);
    
    DWORD ThreadId;
    HANDLE h1;
    h1 = CreateThread(NULL,0,recevoir, &socket_perso, 0, &ThreadId);
    
    
    envoyer(socket_perso);
    
    fermeture(socket_perso);
    
    system("pause");
    TerminateThread(h1,0);
    system("pause");
    return 0;
    }
    
    
    
    void wsa_start()
    {
    int erreur;
    WSADATA initialisation_win32;
    erreur=WSAStartup(MAKEWORD(2,2),&initialisation_win32);
    if(erreur != 0)
    {printf("wsa_startup echouée\n");}
    else
    {printf("wsa_startup : OK\n");}
    }
    
    void connecter(SOCKADDR_IN *info_source, SOCKET socket)
    {
    int erreur = connect(socket, (struct sockaddr*)info_source, sizeof(*info_source));
    if(erreur != 0)
    {printf("connection echouée %d\n",WSAGetLastError());
    //exit(0);
    }
    else
    {printf("connection : OK\n");}
    }
    
    void envoyer(SOCKET socket)
    {
    int erreur;
    char message [1500];
    fgets(message, 1500, stdin);
    erreur = send(socket, message, strlen(message), 0);
    if(erreur == 0)
    {printf("envoie echoué\n");}
    else
    {printf("envoie OK\n");}
    }
    
    int fermeture(SOCKET socket_perso)
    {
    int err_cleanup, erreur_s, erreur_c, erreur;
    erreur_s = shutdown(socket_perso, 2);
    erreur_c = closesocket(socket_perso);
    err_cleanup=WSACleanup();
    if(erreur_s == 0 && erreur_c == 0 && err_cleanup == 0)
    			{erreur = 0;
    			return erreur;}
    else 
    	 		{erreur = 1;
    			return erreur;}
    }
    
    unsigned long WINAPI recevoir(void* socket)
    {
    SOCKET* sock = socket;
    
    char buffer[1024], ancien_buffer[1024];
    FILE* conv =fopen("conv.txt","w");
    	while(strstr(buffer,"esc") ==0)
    	{
    		recv(*sock, buffer, sizeof(buffer), 0);
    		if(strcmp(buffer, ancien_buffer)== 0)
    		{fprintf(conv, buffer);
            strcpy(ancien_buffer,buffer);}
    		printf("salut \n");//pour voir si çamarche
    		sleep(500);
    	}
    fclose(conv);
    	return 0;
    }
    le thread est tout à la fin.
    je ne voit pas ce qui peut buguer étant donné que si je met le code du thread dans le main en remplacant sock par socket_perso ça marche parfaitement.

    marci d'avance
    hedi07
    Fichiers attachés Fichiers attachés

Discussions similaires

  1. création d'un threads sous windows
    Par levaron dans le forum Threads & Processus
    Réponses: 5
    Dernier message: 09/06/2009, 11h35
  2. [Parallèle] Création d'un thread, sous windows.
    Par z980x dans le forum Threads & Processus
    Réponses: 1
    Dernier message: 11/11/2008, 12h44
  3. [Freezes] Python+Threads sous Windows
    Par gslongo dans le forum GTK+ avec Python
    Réponses: 6
    Dernier message: 24/06/2008, 21h12
  4. [C] Thread sous windows
    Par ben78 dans le forum Windows
    Réponses: 1
    Dernier message: 07/12/2007, 23h54
  5. Threads sous Windows
    Par Geoff-sk8 dans le forum Windows
    Réponses: 2
    Dernier message: 23/10/2006, 10h23

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo