[C] send multiple sur serv multithreads

Fermé
orci76 - 30 juil. 2010 à 03:52
 orci76 - 31 juil. 2010 à 03:48
Bonjour,
Je suis en ce moment sur la programmation d'un serveur multithread en C.
Je l'est déclaré comme cela :
       pthread_t thread;
       pthread_create(&thread, NULL, nClient, NULL);


et ma fonction est :

void* nClient(void* data)
{
    do
    {
        if((sock=accept(server,(SOCKADDR*)&sin,&sinsize))!=INVALID_SOCKET)
		{
		    printf("\nNouveaux client acceptee !\n");
		}
    } while(1);
}

Tel que j'ai fais mon code, des que le premier client est acceptée, la fonction nClient est lançée et prêt à en acceptée d'autres.
Donc, aucun problème, les clients sont acceptées, mais des que nous envoyons un message (que je veut transmettre à tout les clients), seuls le dernier client connectés le reçoit.

D'après ce que j'ai pu comprendre, il faudrais faire un tableau de socket et donc l'envoyée à tout le tableau.
Mais avec mes recherches Google, j'ai trouvé que des réponses sur des personnes voulant envoyées des tableau par des sockets, et non crée un tableau de socket.

Bref merci de votre aide et bonne nuit à tout les couche-tard.
Raphaël.

PS : J'utilise Code Blocks avec la librairie Pthread.

A voir également:

4 réponses

Char Snipeur Messages postés 9813 Date d'inscription vendredi 23 avril 2004 Statut Contributeur Dernière intervention 3 octobre 2023 1 298
30 juil. 2010 à 08:03
Salut.
J'ai un projet un peu similaire au tient : un chat multiclient, genre les discusions internet.
J'ai donc fait un tableau de socket, mais c'est assez galère à gérer. Le problème c'est la taille du tableau et les gens qui risquent de se déconnecter.

Sinon, je ne comprends pas où est ta question, où est ton problème ? Tu as trouvé toi même la réponse.
0
Salut,
Merci de ta réponse, oui, en faite, j'ai trouvé qu'il fallais faire un tableau de socket, mais je n'est rien trouvé sur comment le faire, et le gérer par la suite.
C'est la mon problème (et comme j'expliquais je n'est rien trouvé de précis sur internet).
Désolé du manque de précision.
Raphaël.
0
Char Snipeur Messages postés 9813 Date d'inscription vendredi 23 avril 2004 Statut Contributeur Dernière intervention 3 octobre 2023 1 298
30 juil. 2010 à 16:30
en fait, ton problème est découplé des socket. Il conserne la gestion de file ou de pile en thread.
En C++, ça serait plus simple, grace aux conteneurs de la STL.
plutôt qu'un tableau, tu peux faire une liste chainée :
struct tab_sock
{ int s; // s stocke la valeur du socket
tab_sock* suivant;
}
en suite, tu fait une variable globale pointant sur le premier client connecter. Le reste c'est de la gestion de liste chainée avec malloc et free.
exemple de fonction
int send_at_all(tab_sock* debut,const cahr * message)
{
    tab_sock* current;
    for(current=debut;current->suivant!=0;current=current->suivant)
        send(current->s,message,strlen(message));
     return 1;
}
0
Salut,
J'ai testé ce que du m'as donnée, j'ai du me planter quelque part, j'ai mis les deux fonction (après le main), j'ai déclarer la variable globale "char debut[512];" et il m'a semblé que c'était à peut près tout.
Mais le compilateur ma sorti 4 erreur que je n'est pas vraiment comprises, enfin à moitier :

Pour la fonction "int send_at_all(tab_sock* debut,const cahr * buffer)"
J'ai : - 69|error: expected ',' or '...' before '*' token|
- 70|error: new types may not be defined in a return type|
- 70|error: extraneous 'int' ignored|
- 70|error: ISO C++ forbids declaration of 'cahr' with no type|
et au niveau de cette fonction, mais pour le "return 1" :
- 74|error: conversion from 'int' to non-scalar type 'tab_sock' requested|

Désolé, je ne suis pas très bon, j'ai 14 ans et j'ai commencé la programmation il n'y à pas longtemps.

Pour être plus parlant je met quand même la source en entier :


#include <stdlib.h>
#include <stdio.h>
#include <winsock2.h>
#include <iostream.h>
#include <windows.h>
#include <string.h>
#include <pthread.h>
#pragma comment(lib,"ws2_32.lib")

void* clientFinder(void* data);
SOCKET server;
SOCKET sock;
SOCKADDR_IN sin;
char debut[512];
char buffer[512];
int sinsize;
int main()
{
	WSADATA wsa;
	WSAStartup(MAKEWORD(2,0),&wsa);

	SOCKADDR_IN sinserv;
	printf("Server TCP\n\n");
    pthread_t thread;
	int port;
	printf("PORT : ");
	scanf("%i",&port);

	sinserv.sin_family=AF_INET;
	sinserv.sin_addr.s_addr=INADDR_ANY;
	sinserv.sin_port=htons(port);

	server=socket(AF_INET,SOCK_STREAM,0);
	bind(server,(SOCKADDR*)&sinserv,sizeof(sinserv));
	listen(server,0);
	int err=0;
	while(1)
	{
		sinsize=sizeof(sin);
		if((sock=accept(server,(SOCKADDR*)&sin,&sinsize))!=INVALID_SOCKET)
		{
            pthread_create(&thread, NULL, clientFinder, NULL);
			while(err>-1)
			{
			  printf("Veuillez saisir le message a envoyer : ");
			  fgets(buffer, 511, stdin);
			  send(sock,buffer,strlen(buffer)+1,0);
			}
		}
	}

}

void* clientFinder(void* data)
{
    do
    {
        if((sock=accept(server,(SOCKADDR*)&sin,&sinsize))!=INVALID_SOCKET)
		{
		    printf("\nNouveaux client acceptee !\n");
		}
    } while(1);
}
struct tab_sock
{
    int s; // s stocke la valeur du socket
    tab_sock* suivant;
}
int send_at_all(tab_sock* debut,const cahr* buffer)
{
    tab_sock* current;
    for(current=debut;current->suivant!=0;current=current->suivant)
    send(current->s,buffer,strlen(buffer),0);
    return 0;
}


Bonne nuit à tous, bon, je planche encore un peut sur sa, et je vais (essayer) de dormir.

Merci, Raphaël.
0