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
send.c
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
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 #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; }
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
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; }
Merci d'avance
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
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 :
main.c
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2 SOCKET newSocket = &socket;
PS2: L'indentation chez moi est parfaite mais ici c'est la catastrophe, désolé
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2 pthread_create(&threadSend, NULL, sendMessage, (void*)&newSocket);![]()
Partager