Socket non bloquant

Signaler
Messages postés
6
Date d'inscription
vendredi 6 décembre 2002
Statut
Membre
Dernière intervention
28 mai 2008
-
Messages postés
6
Date d'inscription
vendredi 6 décembre 2002
Statut
Membre
Dernière intervention
28 mai 2008
-
salut,

Si quelqu'un pouvait m'aider.
En fait, mon probleme est que j'arrive a réaliser une connection en socket client/serveur mais le probleme c que mon prog doit gerer l'affichage et que l'affichage se bloque en attente de reception. C'est pour cela que je veux realiser des sockets non bloquants.

Si quelqu'un pouvait me dire ce que je dois modifier a mon prog pour qu'il soit non bloquant (j'ai essayer en lisant l'aide de msdn mais g pas compris grand chose)

a+
merci

void CReseaux::init_serv()
{

WORD wVersionRequested;
WSADATA wsaData;
wVersionRequested = MAKEWORD(1, 1);
if (WSAStartup(wVersionRequested, &wsaData))
{
AfxMessageBox("Erreur WSAStartup",NULL);
exit(1) ;
}



(SocServ1) = socket(AF_INET,SOCK_STREAM,0);
if((SocServ1)==INVALID_SOCKET)
{
AfxMessageBox("ERREUR SOCKET",NULL);
// exit(1) ;
}
else
// cout << "SOCKET : " << (SocServ1) << endl;



sain.sin_family = AF_INET;
sain.sin_port = htons(PORT);
sain.sin_addr.s_addr = INADDR_ANY;

if(bind((SocServ1), (struct sockaddr *) &sain, sizeof(struct sockaddr_in)) == SOCKET_ERROR)
{
AfxMessageBox("ERREUR BIND",NULL);
// exit(1) ;
}

if (listen((SocServ1), 5)==SOCKET_ERROR)
{
AfxMessageBox("ERREUR LISTEN",NULL);
// exit(1) ;
}

/*WSAAsyncSelect ( SocServ1,hWnd, wMsg,lEvent);*/


struct sockaddr_in fsain;
int fromlen = sizeof(struct sockaddr_in);
(SocServ2) = accept((SocServ1),(struct sockaddr *) &fsain, &fromlen);

if(SocServ2==SOCKET_ERROR)
{
AfxMessageBox("ERREUR ACCEPT ",NULL);
// exit(1) ;
}
}

int CReseaux::fonc_receiv( char * buffer)
{

// reception des données
rec = recv((SocServ2),buffer,64*sizeof(char),0);
// on ajoute un caractere de fin de chaine de caractere
if(rec == WSAEWOULDBLOCK)
{
return 0;
}
else
{
buffer[rec] = '\0' ;
return 1;

}

}

2 réponses

Messages postés
10
Date d'inscription
vendredi 10 janvier 2003
Statut
Membre
Dernière intervention
16 juin 2003
1
Explication :
Pour creer une socket il suffit de dériver une classe CMySocket de CSocket (sockets en mode bloquant) ou CAsyncSocket (sockets en mode non bloquant) .

Voila donc en fait pour pas que ton affichage freeze, tu as 2 possiblites. Soit tu utilisesCAsyncSocket, soit tu utilises des Threads.

Voila j'espere que tu as compris :)
Messages postés
6
Date d'inscription
vendredi 6 décembre 2002
Statut
Membre
Dernière intervention
28 mai 2008

merci de ton aide.

J'ai décidé d'opter pour les threads mais j'ai un probleme.
En effet, j'ai besoin de savoir quand se termine le thread pour en lancer un autre (car ce thread se trouve dans un timer) mais je n'ai trouvé qu'une fonction d'attente de thread bloquante ( WaitForSingleObject) alors si vous avez une idée.

a+
merci

if(debut == true)
{
debut = false;
hThread = CreateThread( NULL,
0,
( LPTHREAD_START_ROUTINE )fonc_receiv,
&pt,
0,
&ThreadId );

//Test sur CreateThread pour voir si il n'y a pas d'erreur
if( !hThread )
{
TerminateThread( hThread, ERROR_READ );
exit (1);
}

if( WaitForSingleObject( hThread, INFINITE ) == WAIT_OBJECT_0 )//si la fonction renvoit quelquechose, nous avons un timeout
{
debut = true;
}

}