hugo25 | Je réalise une fonction (sous linux) pour améliorer la fonction recv, notamment en gérant les paquet coupé en ethernet et un timeout :
Code :
- int recvPaquet(int sock, char *paquet, int longueur)
- {
- int nbRecu = 0, nbRecu2 = 1;
- int retval;
- fd_set readfds;
- struct timeval timeout;
- FD_ZERO(&readfds);
- FD_SET(sock, &readfds);
- timeout.tv_sec = TIMEOUT;
- timeout.tv_sec = 1;
- timeout.tv_usec = 0;
- retval = select(sock+1, &readfds, NULL, NULL, &timeout);
- if (retval) {
- nbRecu = recv(sock, paquet, longueur, 0);
- // On gère le cas ou tous les caracteres voulu ne sont pas arrivées
- nbRecu2= nbRecu;
- while ((nbRecu > 0) && (nbRecu != longueur) && (nbRecu2 > 0)) {
- paquet += nbRecu2;
- nbRecu2 = recv(sock, paquet, longueur - nbRecu, 0);
- if (nbRecu2 >= 0) {
- nbRecu += nbRecu2;
- }
- else {
- nbRecu = nbRecu2;
- }
- }
- return nbRecu;
- }
- else {
- printf("recvPaquet %d\n",retval);
- return -1;
- }
- }
|
J'ai fait la même chose pour la fonction send
Code :
- int sendPaquet(int sock, char *paquet, int longueurPaquet)
- {
- int nbRecu = 0;
- int retval;
- fd_set readfds;
- struct timeval timeout;
- FD_ZERO(&readfds);
- FD_SET(sock, &readfds);
- timeout.tv_sec = TIMEOUT;
- timeout.tv_sec = 10;
- timeout.tv_usec = 0;
- retval = select(sock+1, &readfds, NULL, NULL, &timeout);
- if (retval) {
- nbRecu = send(sock, paquet, longueurPaquet, 0);
- printf("sendPaquet lg=%d send=%d\n",longueurPaquet,nbRecu);
- return nbRecu;
- }
- else {
- printf("sendPaquet ERREUR %d\n",retval);
- return -1;
- }
- }
|
La fonction recvPaquet marche bien. Les octets sont bien envoyés avec le fonction sendPaquet, mais immédiatement après le serveur coupe la communication. Je ne peux plus envoyer ou recevoir de données au serveur. Je voudrais verifier que la communication avec le serveur n'a pas été coupé avant d'envoyer. Ceci afin de rendre le send non bloquant.
Est-ce comme celà que je dois proceder ? Message édité par hugo25 le 29-06-2006 à 11:07:10
|