Trheads

stevelaclasse Messages postés 6 Statut Membre -  
Char Snipeur Messages postés 10112 Date d'inscription   Statut Contributeur Dernière intervention   -
Bonjour,
bon je realise un programme sur les sockets en c ;la probleme est que cette socket est bloquante .
on m'as dit que si je pouvais deux trheads chez le client et chez le serveur l'un des trheads s'ocuppe de la reception et l'autre de l'envoi ; ma socket ne serai plus bloquante .
svp quelqu'un pourrais t-il me monter comment on cree des trheads en c et peut m'en donner un exemple pour mon cas .
merci
voici mon programme

client

#include <stdio.h> // printf
#include <conio.h> // getch()
#include <winsock2.h>
#pragma comment(lib, "ws2_32.lib")
#include <string.h>
int main()
{
WSADATA WSAData;
WSAStartup(MAKEWORD(2,0), &WSAData);
SOCKET sock;
SOCKADDR_IN sin;
char buffer[255];
char ip[15] ;
sock = socket(AF_INET, SOCK_STREAM, 0);
printf("entrer l'ip de votre serveur") ;
gets(ip) ;
/*remplace l'ip par celle de la machine possédant le serveur*/
sin.sin_addr.s_addr = inet_addr(ip);
/*--------------------------------------------------------------------------*/
sin.sin_family = AF_INET;
sin.sin_port = htons(4444);
connect(sock, (SOCKADDR *)&sin, sizeof(sin));
while(1)
{
{
recv(sock,buffer,64*sizeof(char),0);
printf("\n %s",buffer) ;
Beep(400,150);
memset(buffer, 0, 64*sizeof(char));
}
{
char chaine[1000];
fflush(stdin);
printf("client:");
gets(chaine) ;
if (strlen(chaine)>=0) {
sprintf (buffer, "client dit:%s\n", chaine);
send (sock, buffer, strlen (buffer), 0);}
}
}
}

serveur

#include <stdio.h>
#include <winsock2.h>
#pragma comment(lib, "ws2_32.lib")
#include <string.h>
int main()
{
char buffer[255];
WSADATA WSAData;
WSAStartup(MAKEWORD(2,0), &WSAData);
SOCKET sock;
SOCKET csock;
SOCKADDR_IN sin;
SOCKADDR_IN csin;
sock = socket(AF_INET, SOCK_STREAM, 0);
sin.sin_addr.s_addr = INADDR_ANY;
sin.sin_family = AF_INET;
sin.sin_port = htons(4444);
bind(sock, (SOCKADDR *)&sin, sizeof(sin));
listen(sock, 0);
int sinsize = sizeof(csin);
if((csock = accept(sock, (SOCKADDR *)&csin, &sinsize)) != INVALID_SOCKET)
{
memset(buffer,0,255);
wsprintf(buffer,"connexion etablie \n");
send(csock,buffer,255,0);
}
while(1)
{
{
recv(sock,buffer,64*sizeof(char),0);
printf("\n %s",buffer) ;
Beep(400,150);
memset(buffer, 0, 64*sizeof(char));
}
{
char chaine[1000];
fflush(stdin);
printf("serveur:");
gets(chaine) ;
if(strlen(chaine)>=0) {
sprintf (buffer, "serveur dit :%s\n", chaine);
send (csock, buffer, strlen (buffer), 0);}
}
}
}

2 réponses

Char Snipeur Messages postés 10112 Date d'inscription   Statut Contributeur Dernière intervention   1 299
 
pour les thread, je te conseil la bibliothèque"pthread" qui est simple et bien documenté.
Avec des threads, les sockets sont toujours bloquant, mais les tâches étant séparer, l'attente est aussi séparer.
Le principe des thread, c'est de lancer une fonction de manière détaché, un peu comme si elle était lancé dans un nouveau processus (sur un processeur multitâche).
Ton premier travail avant d'utiliser les thread est de modifier ton programme pour mettre reception et envoi dans des fonctions.
0
stevelaclasse Messages postés 6 Statut Membre
 
bon en fait ce que je veux c'est rendre ma socket non bloquant donc si les threads ne le font pas pourrais tu m'aider a le faire ; je pense a une autre astuces pour rendre les socket non bloquant.
svp .
0
Char Snipeur Messages postés 10112 Date d'inscription   Statut Contributeur Dernière intervention   1 299
 
es tu sur de vouloir rendre ta socket non blockante ? C'est beaucoup plus coton à gérer, il faut vraiment rentrer dans le bas système.
la fonction pour débloquer le socket http://www.linux-kheops.com/doc/man/manfr/man-html-0.9/man2/fcntl.2.html
La meilleur solution c'est les thread (du moins le plus simlpe dans ton cas)
0