Socket : la fonction connect.

Socket : la fonction connect. - C - Programmation

Marsh Posté le 23-12-2004 à 12:16:17    

Voila j'ai fait deux petites applications qui communiquent par socket donc un client et un serveur jusque la rien de supprenant.
 
seulement mon application client peut aussi tourner sans etre connectée a un serveur.
 
donc a chaque fois que je veux envoyer un message au serveur je regarde si  mon client et deja connecte au serveur:
1/ oui deja connecté -> pas de pb j'envoie direct le message
2/ non (fallait s'y attendre) -> j'essaye de me connecter avant (au cas ou  le serveur a ete lance entre tmps) et si oui j'envoie le message sinon je skip l'envoie.
 
voila ce que je fais. Tout fonctionne correctement excepte que la fonction connect() ne retourne pas tout de suite c'est pas bien long environ 0.5 sec mais tres genant pour mon application client.
 
le socket que j'utilise est non bloquant.
 
voici quelques bouts de mon code  
 

Code :
  1. int  Win32SocketClient_Con(PWin32SocketClient self)
  2. {
  3.   self->__bIsConnected = LH_FALSE;
  4.   if (WSAStartup(MAKEWORD(2, 0), &WSAData) == SOCKET_ERROR)
  5.   {
  6.     return SOCKET_ERROR;
  7.   }
  8.   self->__socket  = socket(AF_INET, SOCK_STREAM, 0);        /* create the socket */
  9.   if (self->__socket == INVALID_SOCKET)
  10.   {
  11.     return INVALID_SOCKET;
  12.   }
  13.   return err;
  14. }
  15. int  Win32SocketClient_ConnectToServer(PWin32SocketClient self,
  16.                                             const char* szIPAdd,
  17.                                             unsigned long ulPortNb)
  18. {
  19.   int err = 0;
  20.   struct sockaddr_in remote_socket;
  21.   ioctlsocket(self->__socket, FIONBIO, 1);
  22.   memset(&(remote_socket), 0, sizeof(struct sockaddr_in));
  23.   remote_socket.sin_addr.s_addr = inet_addr( szIPAdd );
  24.   remote_socket.sin_family = AF_INET;
  25.   remote_socket.sin_port = htons((unsigned short)ulPortNb);
  26.   err = connect(self->__socket, (SOCKADDR *)&remote_socket, sizeof(SOCKADDR));
  27.   if (err) TRACE_ERA1 (("Error in connection = %d\n" ),WSAGetLastError());
  28.   if (!err) self->__bIsConnected = LH_TRUE;
  29.   return err;
  30. }

Reply

Marsh Posté le 23-12-2004 à 12:16:17   

Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed