Bonjour, je suis en train de developper une application client/serveur et là j'ai un petit problème avec les thread : (lors de la partie serveur)

send.h

Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
 
#ifndef SEND_H
#define SEND_H
#if defined (WIN32)
#include <winsock2.h>
#elif defined (LINUX)
/* Rien pour le moment */
#else
#error not defined for this platform
#endif
void* sendMessage(void *socket);
#endif //SEND_H
send.c

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
 
#include <stdio.h>
#include <stdlib.h>
#include "send.h"
#include "myHeader.h"
void* sendMessage(void *socket)
{
  int end = 1, sock_err = 0;
 char myMessage[256];
 SOCKET newSocket = &socket;
 do
 {
    fprintf(stdout, "com:>");
    fgets(myMessage, sizeof (myMessage), stdin);
  fclean(myMessage, stdin);
  fprintf(stdout, "\n");
  if(strcmp(myMessage, "STAT_EXIT")==0)
  {
      sock_err = send(newSocket, myMessage, sizeof(myMessage), 0);
   end=0;
  }
  else if(strcmp(myMessage, "ACT_CLS")==0)
  {
   #if defined(WIN32)
    system("CLS");
   #elif defined(LINUX)
    system("clear");
   #endif
  }
  else
  {
      sock_err = send(newSocket, myMessage, sizeof(myMessage), 0);
   if(sock_err != SOCKET_ERROR)
   {
    fprintf(stdout, "Message est envoye'\n\n");
   }
   else
   {
    fprintf(stdout, "Erreur lors de l'envoie du message\n");
   }
   }
 }
 while(end!=0);
 return 0;
}
main.c

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
 
/*
  Name: MySock
 Email: samyhocine_at_hotmail.fr
 Website: samsoft.ift.fr
  Copyright: Gpl v2
  Author: Samy Hocine
  Date: 07/10/07 18:14
  Description: Partie serveur
*/
#include <stdio.h>
#include <stdlib.h>
#include "pthread.h"
#include "myHeader.h"
#ifdef __cplusplus
#error Be sure you are using a C compiler
#endif
#if defined (WIN32)
#include <winsock2.h>
#elif defined (LINUX)
/* Rien pour le moment */
#else
#error not defined for this platform
#endif
#define MY_PORT 1025
#define SUCCESS 0
#define FAILURE -1
void fclean(char *s_buffer, FILE *stream);
void* sendMessage(SOCKET *socket);
int main(void)
{
 pthread_t threadSend;
 pthread_t threadReceive;
 do
 {
 #if defined (WIN32)
        WSADATA WSAData;
     int error = WSAStartup(MAKEWORD(2,0), &WSAData);
 #else
    int error = 0;
  #endif
  fprintf(stdout, "Serveur 1.0\n\n");
 if(!error)
 {
  /*
  Prototype : int socket(int domain, int type, int protocol);
  SOCK_STREAM c'est uniquement pour TCP/IP. Pour UDP/IP c'est SOCK_DGRAM
  On construit une socket
  */
  SOCKET mySocket = socket(AF_INET, SOCK_STREAM, 0);
  /* Si ma socket est valide */
  if(mySocket != INVALID_SOCKET)
  {
   SOCKADDR_IN sin;
   int sock_err;
   fprintf(stdout, "La socket %d est ouverte en mode TCP/IP\n", mySocket);
   /* Adresse ip automatique */
     sin.sin_addr.s_addr = htonl(INADDR_ANY);
     sin.sin_family = AF_INET;
     /* Ecoute d'un port */
     sin.sin_port = htons(MY_PORT);
   sock_err = bind(mySocket, (SOCKADDR *) &sin, sizeof sin);
   if(sock_err != SOCKET_ERROR)
   {
    /* On commence l'e'coute */
    sock_err = listen(mySocket, 5);
    fprintf(stdout, "Ecoute du port %d ...\n", MY_PORT);
    if(sock_err != SOCKET_ERROR)
    {
     /* On attend que quelqu'un se connecte */
     fprintf(stdout, "Attente de connexion sur le port %d ...\n", MY_PORT);
     SOCKADDR_IN newSin;
          int recsize = (int) sizeof newSin;
          SOCKET newSocket = accept(mySocket, (SOCKADDR *) &newSin, &recsize);
          if (newSocket != INVALID_SOCKET)
          {
      int rsltOfShutdown;
            fprintf (stdout, "connexion d'un client avec la socket %d de %s:%d\n\n", newSocket, inet_ntoa (newSin.sin_addr), htons (newSin.sin_port));
      pthread_create(&threadSend, NULL, sendMessage, (void*)&newSocket);
      rsltOfShutdown = shutdown(newSocket, 2);
      if(rsltOfShutdown != SUCCESS)
      {
       fprintf(stdout, "Erreur lors de la fin de connexion\n");
      }
      else
      {
             fprintf (stdout, "Fermeture du client avec la socket %d\n", newSocket);
             closesocket(newSocket);
       fprintf(stdout, "Fermeture du serveur");
      }
     }
     }
    }
  }
  else
  {
   fprintf(stderr, "Socket %d invalide", mySocket);
  }
 }
 #if defined (WIN32)
        WSACleanup();
  #endif
 }
 while(1);
 getchar();
  pthread_join(threadSend, NULL);
  pthread_join(threadReceive, NULL);
  return EXIT_SUCCESS;
}
code d'erreur:

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
 
Compilateur: Default GCC compiler
Building Makefile: "C:\Users\SamSoft\Documents\Programmation\projets\C\Sockets\Makefile.win"
Exécution de  make clean
rm -f obj/main.o obj/send.o obj/myHeader.o  release/Serveur.exe
gcc.exe -c main.c -o obj/main.o -I"include"  -I"C:/Dev-Cpp/include"    -Wall -Wextra -O2 -Wwrite-strings -Wstrict-prototypes -O3
main.c: In function `main':
main.c:95: warning: passing arg 3 of `pthread_create' from incompatible pointer type
gcc.exe -c send.c -o obj/send.o -I"include"  -I"C:/Dev-Cpp/include"    -Wall -Wextra -O2 -Wwrite-strings -Wstrict-prototypes -O3
send.c: In function `sendMessage':
send.c:12: warning: initialization makes integer from pointer without a cast
gcc.exe -c myHeader.c -o obj/myHeader.o -I"include"  -I"C:/Dev-Cpp/include"    -Wall -Wextra -O2 -Wwrite-strings -Wstrict-prototypes -O3
gcc.exe obj/main.o obj/send.o obj/myHeader.o  -o "release\Serveur.exe" -L"C:/Program Files/Dev-Cpp/Lib" ../../../../../../../Dev-Cpp/lib/libws2_32.a  
obj/main.o:main.c:(.text+0x233): undefined reference to `_imp__pthread_create'
make.exe: *** [release/Serveur.exe] Error 1
Exécution terminée
Merci d'avance

PS: J'ai regardé : http://man.developpez.com/man3/pthread_create.3thr.php et j'ai compris comment fonctionne le truc mais je dois avoir un problème avec mes pointeurs ->->

Les lignes surlignées :

send.c :

Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
 
SOCKET newSocket = &socket;
main.c

Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
 
pthread_create(&threadSend, NULL, sendMessage, (void*)&newSocket);
PS2: L'indentation chez moi est parfaite mais ici c'est la catastrophe, désolé