Sockets : Problème serveur [C++] - Programmation
Marsh Posté le 03-06-2001 à 14:20:05
t'en peux plus de tes sockets toi !
comme te conseillait un gars l'autre jour, fait ça en asynchrone. tu pourras trouver sur http://www.sockaddr.com/ExampleSourceCode.html des sources pour un serveur asynchrone (HTTPa.zip) et un client asynchrone (CheckMail.zip)
Marsh Posté le 03-06-2001 à 20:01:53
Ben j'aimerais bien qu'on m'explique ce qu'apportent les sockets async en plus ?
Marsh Posté le 03-06-2001 à 20:11:55
- hum ... l'asynchronisme ? cad ton application peut faire autre chose pendant qu'elle envoie un gros fichier.
- pour cela, tu as des notifications de lecture et d'écriture pour savoir quand envoyer et traiter l'info.
- et dans ce cas présent, l'accès à des sources qui marchent.
- pour finir, je n'ai jamais fait autre chose que des sockets asynchrones, je suis donc incapable de répondre autrement à ton problème.
Marsh Posté le 04-06-2001 à 09:39:05
mais t'es sur que c'est normal que ton code lance "accept" avant chaque lecture ?
je sais pas exactement ce que tu veux faire mais ca me semble un peut etrange ...
en plus tu ne fermes pas la socket "a" apres l'avoir utilisee ...
Marsh Posté le 04-06-2001 à 10:31:40
En effet je viens de me rendre compte que le pb était du à l'appel d'accept() en boucle. Encore merci.
Mais j'ai maintenant un autre problème :
Peut-on appeler accept(), recv(), et réappeler accept() sur le même socket une fois recv() achevé ?
Dans mon code, il accepte la 1ère fois, mais pas la 2ème.
Faut-il refermer le socket renvoyé par accept() ?
Marsh Posté le 04-06-2001 à 10:46:27
accept sert a etablir une connexion TCP et la socket retournee va te servir a communiquer a travers cette connexion. Donc avant d'appeller une nouvelle fois accept, il faut fermer la connexion si tu ne veux plus.
je comprends pas pourquoi tu veux appeller accept une nouvelle fois apres recv ?
Marsh Posté le 05-06-2001 à 16:12:09
après acccept(), j'ai fais un closesocket() de la socket retournée par accept(), mais le serveur n'accepte plus d'autres clients. Faut-il appeler une autre fonction que closesocket avant de réappeler accept() ?
Marsh Posté le 06-06-2001 à 03:15:28
non, il n'y a pas a appeller d'autres fonctions que closesocket() pour fermer une socket. enfin ca fait longtemps que j'ai pas code de sockets sous win mais je pense pas me tromper ....
qu'est-ce que tu veux dire par "le serveur n'accepte plus d'autres clients" ?
peux-tu nous montrer ton code modifie ?
Marsh Posté le 06-06-2001 à 13:50:06
C'était tout simplement une variable non initialisée qui faisait tout planter.
Merci
Marsh Posté le 03-06-2001 à 11:02:31
Ce bout de code d'un serveur ne reçoit qu'un seul message d'un client. Les autres ne sont pas reçus.
Pourriez-vous me dire où est le problème ?
Merci
SOCKET s;
SOCKET a;
SOCKADDR_IN localaddr;
WSADATA wsa;
WORD v;
char data[255];
int cb,r,ca;
unsigned short nport = 1050;
unsigned long *nonbl;
unsigned long ul = 1;
nonbl = &ul;
v = MAKEWORD(2,0); // version 2.0 des Windows Sockets
if (WSAStartup(v, &wsa) != 0)
{
printf("Socket initialization error." );
getch();
exit(1);
}
else
{
s = socket(AF_INET,SOCK_STREAM,0);
if(s == INVALID_SOCKET)
printf("Unable to create socket." );
else
{
localaddr.sin_family = AF_INET;
localaddr.sin_addr.s_addr = INADDR_ANY;
localaddr.sin_port = htons(nport);
if (bind(s,(LPSOCKADDR)&localaddr,sizeof(localaddr)) == SOCKET_ERROR)
printf("Error linking socket-port." );
else
{
if (listen(s,5) == SOCKET_ERROR)
printf("Error listening to socket." );
else
{
ioctlsocket(s,FIONBIO,nonbl); //Mode non bloquant
printf("Press any key to stop...\n" );
do
{
a = accept(s,NULL,NULL);
if (a != INVALID_SOCKET)
{
strcpy(data,"" );
r = recv(a,data,sizeof(data),0);
if (r == SOCKET_ERROR)
{
if (GetLastError() == 10035) //Message vide
printf("/\n" );
else
printf("Reception error (%d).\n",GetLastError());
}
else
printf("\n%s\n",data); //Il affiche que le premier message (vide)
}
Sleep(500);
}
while(!kbhit());
}
}
shutdown(s,SD_BOTH);
shutdown(a,SD_BOTH);
cb = closesocket(s);
ca = closesocket(a);
WSACleanup();
}
}
exit(0);