tertulia | 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 :
- int Win32SocketClient_Con(PWin32SocketClient self)
- {
- self->__bIsConnected = LH_FALSE;
- if (WSAStartup(MAKEWORD(2, 0), &WSAData) == SOCKET_ERROR)
- {
- return SOCKET_ERROR;
- }
- self->__socket = socket(AF_INET, SOCK_STREAM, 0); /* create the socket */
- if (self->__socket == INVALID_SOCKET)
- {
- return INVALID_SOCKET;
- }
- return err;
- }
- int Win32SocketClient_ConnectToServer(PWin32SocketClient self,
- const char* szIPAdd,
- unsigned long ulPortNb)
- {
- int err = 0;
- struct sockaddr_in remote_socket;
- ioctlsocket(self->__socket, FIONBIO, 1);
- memset(&(remote_socket), 0, sizeof(struct sockaddr_in));
- remote_socket.sin_addr.s_addr = inet_addr( szIPAdd );
- remote_socket.sin_family = AF_INET;
- remote_socket.sin_port = htons((unsigned short)ulPortNb);
- err = connect(self->__socket, (SOCKADDR *)&remote_socket, sizeof(SOCKADDR));
- if (err) TRACE_ERA1 (("Error in connection = %d\n" ),WSAGetLastError());
- if (!err) self->__bIsConnected = LH_TRUE;
- return err;
- }
|
|