URL: https://linuxfr.org/forums/programmation-c--2/posts/raw-socket-bug Title: Raw socket (BUG) Authors: DeadMaXfr Date: 2009年01月19日T12:59:32+01:00 Tags: Score: 0 Bonjour à tous J'ai un petit souci avec mon programme. Je suis en train de développer un nouveau protocole sur ethernet. J'utilise donc des RAW socket. Tout va super bien. J'atteint 1,6 Gb/s sur le loopback avec des packets de 1500 octet (ethernet oblige, si pas de jumbo frame ^_^) Mon problème vient de la fermeture de ladite socket. La fonction recvmsg ne me retourne jamais -1 quand je ferme la socket. J'ai isolé le bug ans un petit programme que voici (désolé pour le format, j'ai du mal à le formater) : #include pthread.h #include sys/socket.h #include netpacket/packet.h #include net/ethernet.h #include arpa/inet.h #include sys/ioctl.h #include linux/if.h #include string.h #include stdio.h #include errno.h int sock; struct msghdr packet = {0}; struct sockaddr_ll addr = {0}; struct iovec iov = {0}; struct ifreq ifr = { 0 }; char *name="lo"; char buffer[1500] = {0}; pthread_t tid; pthread_mutex_t mutex; pthread_cond_t cond; int recivelen; static void *reciver(void *arg) { £spaces£ £/spaces£pthread_mutex_lock(&mutex); £spaces£ £/spaces£pthread_cond_signal(&cond); £spaces£ £/spaces£pthread_mutex_unlock(&mutex); £spaces£ £/spaces£while((recivelen=recvmsg(sock,&packet,0))>0) £spaces£ £/spaces£printf("recvmsg return : %d\n",recivelen); } int main() { £spaces£ £/spaces£int errorCondition = 0; £spaces£ £/spaces£// overture de la socket £spaces£ £/spaces£sock = socket ( PF_PACKET, SOCK_DGRAM, htons ( ETH_P_ALL ) ); £spaces£ £/spaces£if ( !sock ) £spaces£ £/spaces£return -1; £spaces£ £/spaces£// attachement sur le loopback £spaces£ £/spaces£errorCondition = setsockopt ( sock,SOL_SOCKET,SO_BINDTODEVICE,name,2); £spaces£ £/spaces£if ( errorCondition ) £spaces£ £/spaces£return errorCondition; £spaces£ £/spaces£// recupère l'index de l'interface. Pas utile ici mais on ne sait jamais £spaces£ £/spaces£strcpy ( ifr.ifr_name, name); £spaces£ £/spaces£errorCondition = ioctl ( sock, SIOCGIFINDEX, &ifr ); £spaces£ £/spaces£if ( errorCondition ) £spaces£ £/spaces£return errorCondition; £spaces£ £/spaces£//construction du packet £spaces£ £/spaces£addr.sll_family = AF_PACKET; £spaces£ £/spaces£addr.sll_ifindex = ifr.ifr_ifindex; £spaces£ £/spaces£addr.sll_halen = ETH_ALEN; £spaces£ £/spaces£addr.sll_protocol = htons ( ETH_P_ALL ); £spaces£ £/spaces£packet.msg_name=&addr £spaces£ £/spaces£packet.msg_namelen = sizeof ( struct sockaddr_ll ); £spaces£ £/spaces£packet.msg_iov = &iov £spaces£ £/spaces£packet.msg_iovlen = 1; £spaces£ £/spaces£iov.iov_base=&buffer £spaces£ £/spaces£iov.iov_len=1500; £spaces£ £/spaces£packet.msg_control = NULL; £spaces£ £/spaces£packet.msg_controllen = 0; £spaces£ £/spaces£packet.msg_flags = 0; £spaces£ £/spaces£// initialisation du mutex pour une sychronisation £spaces£ £/spaces£pthread_mutex_init(&mutex,NULL); £spaces£ £/spaces£pthread_cond_init(&cond,NULL); £spaces£ £/spaces£// démarrage du thread d'écoute £spaces£ £/spaces£pthread_mutex_lock(&mutex); £spaces£ £/spaces£pthread_create(&tid,NULL,&reciver,NULL); £spaces£ £/spaces£// attente du bon démarrage, sinon ça fausse le test £spaces£ £/spaces£pthread_cond_wait(&cond,&mutex); £spaces£ £/spaces£pthread_mutex_unlock(&mutex); £spaces£ £/spaces£// tentative de fermeture avec shutdown, l'erreur est normale £spaces£ £/spaces£errorCondition = shutdown(sock,SHUT_RDWR); £spaces£ £/spaces£if(errorCondition) £spaces£ £/spaces£printf("shutdown fail. errno : %d\n",errno); £spaces£ £/spaces£// fermeture avec close. Pas d'erreurs mais est-ce vrai ? £spaces£ £/spaces£errorCondition = close(sock); £spaces£ £/spaces£if(errorCondition) £spaces£ £/spaces£printf("close fail. errno : %d\n",errno); £spaces£ £/spaces£// attente de la fin du thread £spaces£ £/spaces£pthread_join(tid,NULL); // BUG, le thread ne fini jamais, il continue d'ecouter alors que sa socket est fermé } a compiller avec l'option -lpthread Pouvez vous m'aider, ou est-ce un bug du noyau linux ? Merci a vous

AltStyle によって変換されたページ (->オリジナル) /