Trheads
stevelaclasse
Messages postés
6
Statut
Membre
-
Char Snipeur Messages postés 10112 Date d'inscription Statut Contributeur Dernière intervention -
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);}
}
}
}
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
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.
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.
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 .
svp .
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)
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)