Probleme de thread

karlieff Messages postés 3 Date d'inscription lundi 22 mars 2004 Statut Membre Dernière intervention 26 mars 2004 - 25 mars 2004 à 13:23
karlieff Messages postés 3 Date d'inscription lundi 22 mars 2004 Statut Membre Dernière intervention 26 mars 2004 - 26 mars 2004 à 16:49
Bonjour j'ai un petit probleme sur un thread, je crée une appli fonctionnant sous windows et sous linux qui doit grace a des threads permettre l'envoi de l'heure chaque seconde. Sur windows ca marche mais sur linux ma routine se termine a la fin du premier thread. Voici mon code et merci d'avance.
P.S : je débute donc soyez clément ;).

////////////////////////////////serveur///////////////////////////
// on teste ici l'OS et on definit les variables "WINDOWS" ou "LINUX" en fonction du resultat
#ifdef _MSC_VER
#define WINDOWS
#else
#define LINUX
#endif
#include <sys/types.h>
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include <time.h>
#include <errno.h>

// les includes different selon l'OS
#ifdef LINUX
#include <sys/un.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include /* close */
#include <netdb.h>
#include
#include
#endif

#ifdef WINDOWS
#include <winsock.h>
#pragma comment(lib, "wsock32.lib")
#include <windows.h>
#include <conio.h>
#endif

#define ERREUR 1
#define EXIT_SUCCESS 0
#define MASOCKET 1984
#define NUM_THREADS 10
#define SERVER_PORT 1984
#define SERVERNAME "poire"
#define MAX_TAILLE 50

#ifdef WINDOWS
LPTHREAD_START_ROUTINE envoi (unsigned int new_sock)
{
char buffer [MAX_TAILLE];
#endif

#ifdef LINUX
void *envoi (void *new_sock)
{
char buffer[MAX_TAILLE + 2];
#endif

time_t tics;

do
{
tics = time(NULL);

//on recupere la date et l'heure

#ifdef LINUX
snprintf(buffer, sizeof(buffer), "Date et heure du jour: %.24s\r\n", ctime(&tics));
#endif

#ifdef WINDOWS
_snprintf(buffer, sizeof(buffer), "Date et heure du jour: %.24s\r\n", ctime(&tics));
buffer[MAX_TAILLE + 1] = '\0';
#endif

// on envoie le tout au client
send(new_sock, buffer, strlen(buffer),1);

//on attend 1 seconde
#ifdef WINDOWS
Sleep(1000);
#endif

#ifdef LINUX
sleep(1);
#endif

} while (1);

/*#ifdef LINUX
pthread_exit(0);
#endif*/

}

// declaration de la fonction principale

int
main(int argc, char *argv[]){

// declaration des sockets, structure ...

int cpt;
unsigned int sock_serv, new_sock;
struct sockaddr_in servaddr;

#ifdef WINDOWS
WSADATA WSAData;
int err;
if ((err = WSAStartup(MAKEWORD(1,0), &WSAData)) != 0)
{
printf("WSAStartup error - %d\n", err);
exit(0);
}
#endif

//creation de la socket

if ((sock_serv = socket(AF_INET, SOCK_STREAM, 0)) < 0 )
{
//si ca plante
perror("socket error");
exit(1);
}
else
printf("creation socket ok !! \n");

#ifdef LINUX
//mise a zero de la structure
bzero(&servaddr, sizeof(servaddr));
#endif

//INADDR_ANY signifie que le serveur va accepter une connection
//client sur n'importe-quelle interface

servaddr.sin_family = AF_INET;
servaddr.sin_addr.s_addr = htonl(INADDR_ANY);

//on lie le port du serveur au socket en remplissant la "internet socket adresse structure" et en appellant bind

servaddr.sin_port = htons(MASOCKET);

if (bind(sock_serv, (struct sockaddr *) &servaddr, sizeof(servaddr)) < 0)
{
perror("bind error");
exit(1);
//en cas d'erreur
}

if (listen(sock_serv, 10) < 0)
{
//avec listen, le socket est converti en listening socket (ecoute)
//sur lequel les demandes de connections vont etre acceptees par le Kernel

perror("listen error");
exit(1);
//en cas d'erreur
}

cpt=0;

while (1) //boucle infinie
{
printf("%s: \n attente de connexion sur le port TCP %u\n",argv[0],MASOCKET);

while (cpt<10)
{
if ((new_sock = accept(sock_serv, (struct sockaddr *) NULL, NULL)) < 0)
{

//accept retourne un "descripteur de connection" (connected descriptor) qui est utilise pour la communication avec le nouveau client. Un nouveau pour chaque client

perror("accept error");
exit(1); //et aussi ici
}

printf("socket connectee: %i\n",new_sock);
cpt = cpt + 1;
#ifdef LINUX
pthread_t client[NUM_THREADS];

if (pthread_create(&client[cpt], NULL, *envoi, (void *)new_sock)<0)
{
fprintf(stderr, "Error creating the thread");
exit(1); // encore
}
#endif

#ifdef WINDOWS

unsigned long thread_id[NUM_THREADS];

if (CreateThread(NULL, 0, (LPTHREAD_START_ROUTINE) envoi, (LPVOID) new_sock, 0, &thread_id[cpt]) <0)
{
fprintf(stderr, "Error creating the thread");
exit(1); // encore
}

//TerminateThread(&thread_id[cpt],0);
#endif
printf("creation thread : %d\n",cpt);
}
return 0;
//exit(1);
//closesocket(new_sock);
}
#ifdef WINDOWS
WSACleanup();
#endif
}

///////////////////////////client/////////////////////////////

// on teste ici l'OS et on definit les variables "WINDOWS" ou "LINUX" en fonction du resultat

#ifdef _MSC_VER
#define WINDOWS
#else
#define LINUX
#endif

/*
* Bibliotheques standards
*/

#include <sys/types.h>
#include <stdio.h>
#include <string.h>
#include <stdlib.h> /* exit */

// les includes different selon l'OS

#ifdef LINUX
#include <sys/socket.h>
#include <netinet/in.h>
#include
#include <netdb.h>
#include /* close */
#endif

#ifdef WINDOWS
#include <winsock.h>
#pragma comment(lib, "wsock32.lib")
#include <windows.h>
#include <conio.h>
#endif

/*
* Variables obligatoires
*/

#define SERVER_PORT 1984
#define SERVERNAME "prune"
#define MAX_TAILLE 50
#define EXIT_SUCCESS 0

// Definition du programme principal
int main (int argc, char *argv[]) {

// Declaration de la socket, structure ...
int sock,i;
struct sockaddr_in localAddr,sin;
struct hostent *h;
char buffer [MAX_TAILLE] = "";

#ifdef WINDOWS
WSADATA wsa;
int err;

if ((err = WSAStartup(MAKEWORD(1,0), &wsa)) != 0)
{
printf("WSAStartup error - %d\n", err);
exit(0);
}
#endif

// Creation de la socket
sock = socket(AF_INET, SOCK_STREAM, 0);

h = gethostbyname(SERVERNAME);
memcpy((char *) &sin.sin_addr.s_addr, h->h_addr_list[0], h->h_length);
sin.sin_family = AF_INET;
sin.sin_port = htons(SERVER_PORT);

if(sock<0)
{
perror("Erreur dans la creation du socket\n");
exit(1);
}
else
printf("creation du socket ok!! \n");

// bind sur un port quelconque

localAddr.sin_family = AF_INET;
localAddr.sin_addr.s_addr = htonl(INADDR_ANY);
localAddr.sin_port = htons(0);

int rc = bind(sock, (struct sockaddr *) &localAddr, sizeof(localAddr));

if(rc<0)
{
printf("%s: cannot bind port TCP %u\n",argv[0],SERVER_PORT);
perror("error ");
exit(1);
}
else
printf("Port TCP correct\n");

// connexion de la socket client sur le serveur
if (connect(sock, (struct sockaddr *) &sin,sizeof(sin)) < 0)
{
perror("Il n'y a pas de serveur \n");
exit(1);
}
else
printf("Connexion reussie\n");

i=0;
do
{
recv(sock,buffer,MAX_TAILLE,0);
#ifdef WINDOWS
buffer[MAX_TAILLE] = '\0';
#endif
printf("\n%s\n",buffer);
i=i+1;

} while (i<30);

//close (sock);

return EXIT_SUCCESS;

#ifdef WINDOWS
WSACleanup();
#endif
}

3 réponses

lpikachu58 Messages postés 351 Date d'inscription samedi 2 février 2002 Statut Membre Dernière intervention 6 mai 2004 2
25 mars 2004 à 16:37
hum, je ttrouve pas dsl

be linux
0
karlieff Messages postés 3 Date d'inscription lundi 22 mars 2004 Statut Membre Dernière intervention 26 mars 2004
26 mars 2004 à 10:45
c pas grave merci d'avoir essayer
0
karlieff Messages postés 3 Date d'inscription lundi 22 mars 2004 Statut Membre Dernière intervention 26 mars 2004
26 mars 2004 à 16:49
c bon j'ai trouvé mon probleme il fallait que je mette pthread_exit(client[NUMTHREAD]) a la fin de ma routine .
0
Rejoignez-nous