Socket non bloquant

sisier Messages postés 6 Date d'inscription vendredi 6 décembre 2002 Statut Membre Dernière intervention 28 mai 2008 - 29 janv. 2003 à 10:25
sisier Messages postés 6 Date d'inscription vendredi 6 décembre 2002 Statut Membre Dernière intervention 28 mai 2008 - 29 janv. 2003 à 22:09
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

cs_NiuoGniP Messages postés 10 Date d'inscription vendredi 10 janvier 2003 Statut Membre Dernière intervention 16 juin 2003 1
29 janv. 2003 à 13:03
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 :)
0
sisier Messages postés 6 Date d'inscription vendredi 6 décembre 2002 Statut Membre Dernière intervention 28 mai 2008
29 janv. 2003 à 22:09
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;
}

}
0
Rejoignez-nous