[Socket]

Signaler
Messages postés
54
Date d'inscription
jeudi 6 mars 2003
Statut
Membre
Dernière intervention
31 mai 2012
-
Messages postés
1
Date d'inscription
mardi 26 avril 2005
Statut
Membre
Dernière intervention
31 mai 2005
-
Salut ,

Voila je dois creer un serveur de socket qui accepte qu'une seule connection mais actuellement je ne trouve pas comment faire.
Est ce possible techniquement ? si oui kkun peut il me dire comment faire ?

d'avance merci

Stéphane

16 réponses

Messages postés
1905
Date d'inscription
mercredi 22 janvier 2003
Statut
Membre
Dernière intervention
17 septembre 2012
2
Salut,
tu crée un socket avec socket(...).
bind(...) puis listen(...) pour le faire ecouter sur un port.
et tu attend la connection avec accept(...).
Messages postés
54
Date d'inscription
jeudi 6 mars 2003
Statut
Membre
Dernière intervention
31 mai 2012

Oui c'est ce que je veux mais
dans ce cas la windows reatribu des ports de communication et la socket reste a l'ecoute et du coup un autre client peux se connecter ce qui pose probleme

pour faire plus simple mon pronleme est losque j'ai un souci reseau , la socket client tombe et essaie de se reconnecter "trop vite" , alors que le serveur n'a pas encore vu la deconnexion

je cherche surement dans une mauvais direction mais je suis a court d'idee en fait :'(

Stéphane
Messages postés
1905
Date d'inscription
mercredi 22 janvier 2003
Statut
Membre
Dernière intervention
17 septembre 2012
2
Salut,
J'ai pas trop bien compris ton prob de souci reseau et de socket qui tombe.
Essaye d'etre plus clair, ou de coder un bout de code histoire qu'on comprenne ce que tu veux faire et quels sont les probs rencontrés.
Messages postés
54
Date d'inscription
jeudi 6 mars 2003
Statut
Membre
Dernière intervention
31 mai 2012

Ok désolé
c'est vrai que ce n'est pas tres clair
vais essayer de m'expliquer plus clairement
donc voila

j'ai un serveur de socket a realiser j'utilise pour mettre le serveur en ecoute les fonctions que tu as cités
or si je regarde mes ports ouvert je remarque que lorsque mon client se connecte window reattibut un port de travail pour et la socket reste a l'ecoute sur mon port de depart .
en gros le code donne ca dans un thread

while (1)
{
if (!connecter)
{
socket(...)
bind(...)
accept(...)
connecter )= true
}
traitement()
envoie timeout
si erreur close()
}

Comme la socket reste a l'ecoute un autre client peux se connecter alors que je suis deja en traitement ce qui peux poser pb lorsque le client se deconnecte et se reconnecte trop vite , le serveur n'a pas "vu" la deconnection

du coup le client "croit" etre connecter alors qu'en fait aucun traitement n'est fait

c'est pas tres facile a expliquer en fait j'espere avoir ete plus clair

merci

Stéphane
Messages postés
1905
Date d'inscription
mercredi 22 janvier 2003
Statut
Membre
Dernière intervention
17 septembre 2012
2
Salut,
Avec ce code, jamais un client ne pourra se connecter pendant qu'un autre est en traitement, car tout est dans un meme thread.
Mais puisque tu ne souhaite gerer qu'un client, pourquoi met tu une boucle dans un thread séparé? c'est plutot pour accepter plusieurs connections qu'on fait ca normalement.
Messages postés
54
Date d'inscription
jeudi 6 mars 2003
Statut
Membre
Dernière intervention
31 mai 2012

beh en fait si .. un client peux se connecter quand meme meme.Si il est pas connecter au thread il semble etre au moins connecter a window vu que la socket est de nouveau en mise ecoute par window

j'utilise un thread car en fait j'ai un autre thread qui est client sur un autre serveur de socket et comme ca j'ai qu'un programme qui gere 2 connections differentes

c'est vrai que je detourne le principe des serveurs de socket mais le client veux ca :(

Donc beh voila le proble reste un mistere :(

Merci

Stéphane
Messages postés
1905
Date d'inscription
mercredi 22 janvier 2003
Statut
Membre
Dernière intervention
17 septembre 2012
2
Salut,
Tu passes quoi en 2eme parametre a listen(...) ?
Messages postés
54
Date d'inscription
jeudi 6 mars 2003
Statut
Membre
Dernière intervention
31 mai 2012

j'utilise ca :

if( listen(MainSock,1 )==SOCKET_ERROR )


j'ai essaye 0 ca change rien au debut il y avait 5
Messages postés
54
Date d'inscription
jeudi 6 mars 2003
Statut
Membre
Dernière intervention
31 mai 2012

j'ai trouve ca sur MSDN

virtual BOOL Accept( CAsyncSocket& rConnectedSocket, SOCKADDR* lpSockAddr NULL, int* lpSockAddrLen NULL );

Call this member function to accept a connection on a socket. This routine extracts the first connection in the queue of pending connections, creates a new socket with the same properties as this socket, and attaches it to rConnectedSocket. If no pending connections are present on the queue, Accept returns zero and GetLastError returns an error. The accepted socket (rConnectedSocket) cannot be used to accept more connections. The original socket remains open and listening. 


The original socket remains open and listening.
donc voile le pb :(
Messages postés
1905
Date d'inscription
mercredi 22 janvier 2003
Statut
Membre
Dernière intervention
17 septembre 2012
2
Salut,
Si c'est simplement ca qui te gene, ferme le socket d'ecoute une fois que ton client est connecté, avec shutdown par exemple.
Messages postés
1905
Date d'inscription
mercredi 22 janvier 2003
Statut
Membre
Dernière intervention
17 septembre 2012
2
Salut,
j'ai fait des tests avec listent(socket, 0);
un seul client peut etre connecté a la fois, tout les autres retournent l'erreur 10061: connection refusée par le serveur.
Messages postés
54
Date d'inscription
jeudi 6 mars 2003
Statut
Membre
Dernière intervention
31 mai 2012

shutdown ... il bloque pas le dialogue sur une socket ?
je pensais plus a un close ou closeaccept tu en penses koi ?

merci

Stéphane
Messages postés
54
Date d'inscription
jeudi 6 mars 2003
Statut
Membre
Dernière intervention
31 mai 2012

bon avec le parametre a zero ca change rien toujours possibilité de se connecter a plusieurs ... doit surement y avoir autre chose ...ou alors chui pas doué :p

merci

Stéphane
Messages postés
1905
Date d'inscription
mercredi 22 janvier 2003
Statut
Membre
Dernière intervention
17 septembre 2012
2
Salut,
En théorie il faut appeller shutdown pour couper la connection et closesocket pour fermer le socket.
Mais bon, pour un socket en ecoute, closesocket seul fait pareil il me semble.
Messages postés
54
Date d'inscription
jeudi 6 mars 2003
Statut
Membre
Dernière intervention
31 mai 2012

ok merci beaucoup pour ton aide , j'ai trouve , sur ton site ;), des sources a parti desquels je vais m'inspirer pour revoir mon code
sur l'exemple que j'ai trouve un seul client a la fois arrive a se conneceter

encore merci :d

Stéphane
Messages postés
1
Date d'inscription
mardi 26 avril 2005
Statut
Membre
Dernière intervention
31 mai 2005

les sockets qui geres les clusters