Salut à tous!
Je ne sais pas trop si ce forum correspond à mon blème mais ça pourrais être ça. VEuillez le déplacer si ce n'est pas le cas.
J'écris une application client/serveur avec GTK! Le moment est venu où je dois faire cohabiter GTK et WINSOCK! Pour commencer j'ai écris deux petits programmes juste pour essayer. C'est composé de 2 fenêtre (1 client et un serveur). Si le client parvient à se connecter au serveur, il lui envoie un texte. si le serveur le reçoit alors il l'affiche dans une boite de dialogue. ce petit exemple pour tester ne marche pas. je ne sais pas si c'est un conflit avec la boucle de gtk. Veuillez consulter mon code que voici:
partie serveur:
code client:
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 struct cli{ pthread_t thread; SOCKADDR_IN sin; int recsize; SOCKET sock; }; void *client(void *data) { struct cli *p2=(struct cli*)data; int end=0; gchar *info=NULL; unsigned char texte[50]; int rep; do{ rep=recv(p2->sock,texte,(sizeof(texte)-1),0); if(rep!=SOCKET_ERROR){ info=g_strdup_printf("Message envoye par le client: %s",texte); informations(info); g_free(info); } else { erreur("Erreur de réception"); end=1; } } while(end==0); shutdown(p2->sock,2); closesocket(p2->sock); free(p2); return NULL; } /*---------------------------------------*/ void clients(SOCKET sock) { int end=0; do{ struct cli*p=malloc(sizeof(*p)); if(p!=NULL){ p->recsize=(int)sizeof(p->sin); p->sock=accept(sock,(SOCKADDR*)&p->sin,&p->recsize); pthread_create(&p->thread,NULL,client,p); p=NULL; } else { end=1; } }while(end==0); } /*------------------------------------------------------------*/ gboolean app(gpointer data) { SOCKET sock=socket(AF_INET,SOCK_STREAM,0); if(sock!=INVALID_SOCKET){ SOCKADDR_IN sin={0}; sin.sin_addr.s_addr=htonl(INADDR_ANY); sin.sin_family=AF_INET; bind(sock,(SOCKADDR*)&sin,sizeof(sin)); listen(sock,5); clients(sock); } } int main (int argc, char *argv[]) { GtkWidget *fenetre=NULL; WSADATA WSAData; WSAStartup(MAKEWORD(2,2),&WSAData); gtk_init(&argc,&argv); fenetre=gtk_window_new(GTK_WINDOW_TOPLEVEL); gtk_window_set_default_size(GTK_WINDOW(fenetre),320,200); gtk_window_set_title(GTK_WINDOW(fenetre),"Essai de Socket et GTK et THREAD"); gtk_window_set_position(GTK_WINDOW(fenetre),GTK_WIN_POS_CENTER); g_signal_connect(G_OBJECT(fenetre),"destroy",G_CALLBACK(gtk_main_quit),NULL); gtk_widget_show_all(fenetre); g_idle_add((GSourceFunc)app,NULL); //app(NULL); gtk_main(); WSACleanup(); return 0; }
gboolean app(gpointer data)
{
char texte[]="OK";
SOCKET sock=socket(AF_INET,SOCK_STREAM,0);
if(sock!=INVALID_SOCKET){
SOCKADDR_IN sin={0};
sin.sin_addr.s_addr=inet_addr("127.0.0.1");
sin.sin_family=AF_INET;
sin.sin_port=htons(23);
if(connect(sock,(SOCKADDR*)&sin,sizeof(sin))!=SOCKET_ERROR){
send(sock,texte,sizeof(texte),0);
}
closesocket(sock);
}
}
int main (int argc, char *argv[])
{
GtkWidget *fenetre=NULL;
WSADATA WSAData;
WSAStartup(MAKEWORD(2,2),&WSAData);
gtk_init(&argc,&argv);
fenetre=gtk_window_new(GTK_WINDOW_TOPLEVEL);
gtk_window_set_default_size(GTK_WINDOW(fenetre),320,200);
gtk_window_set_title(GTK_WINDOW(fenetre),"Essai de Socket et GTK et THREAD (CLIENT)");
gtk_window_set_position(GTK_WINDOW(fenetre),GTK_WIN_POS_CENTER);
g_signal_connect(G_OBJECT(fenetre),"destroy",G_CALLBACK(gtk_main_quit),NULL);
gtk_widget_show_all(fenetre);
g_idle_add((GSourceFunc)app,NULL);
//app(NULL);
gtk_main();
WSACleanup();
return 0;
}
Quelqu'un a t-il déjà écrit une application utilsant GTK et les sockets. si oui veuillez me sortir de ce pétrin je vous prie.
Partager