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;
} |