A voir également:
- [C] send multiple sur serv multithreads
- Local send - Télécharger - Divers Utilitaires
- Liste déroulante choix multiple excel - Guide
- Ecran multiple pc - Guide
- Windows presse papier multiple - Guide
- Bug instagram publication multiple - Forum Instagram
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
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.
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.
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.
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.
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
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
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; }
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 :
Bonne nuit à tous, bon, je planche encore un peut sur sa, et je vais (essayer) de dormir.
Merci, Raphaël.
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.