title: deadlock with socket
body: <p>I have written this program to send and receive packets from ipv6 on eth0:</p>
  
  <pre><code>#include&lt;sys/socket.h&gt;
  #include&lt;sys/types.h&gt;
  #include &lt;netinet/in.h&gt;
  #include &lt;stdio.h&gt;
  #include &lt;netdb.h&gt;
  #include &lt;errno.h&gt;
  #include &lt;net/if.h&gt;
  #include &lt;sys/ioctl.h&gt;
  #include &lt;stdlib.h&gt;
  #include &lt;string.h&gt;
  #include &lt;unistd.h&gt;
  #include &lt;fcntl.h&gt;
  int main() {
  
      int sock,i;
      struct sockaddr_in6 *address;
      struct protoent *proto;
      struct ifreq ethreq, Interface, Interface1;
      unsigned char buffer[2048];
      unsigned char tbuff[2048];
      unsigned char *iphead, *ethhead,*phead;
      static const uint8_t mys6_addr[16]={0x54,0x04,0x20,0x49,0x0e,0x40,0xc7,0x03,0xa0};
  
      //open socket for receive ipv6 packet 
      sock=socket(AF_INET6, SOCK_RAW,255);
      //control error
      if(sock&lt;0) {
          perror("socket");
          exit(1);
      }
  
      strncpy(ethreq.ifr_name, "eth0", IFNAMSIZ);
      if (ioctl(sock,SIOCGIFFLAGS, &amp;ethreq) == -1) {
          perror("ioctl");
          close(sock);
          exit(1);
      }
  
      ethreq.ifr_flags |= IFF_PROMISC;
      if (ioctl(sock, SIOCSIFFLAGS, &amp;ethreq) == -1) {
          perror("ioctl");
          close(sock);
          exit(1);
      }
  
      //bind to sock with eth0 
      memset(&amp;Interface, 0, sizeof(Interface));
      strncpy(Interface.ifr_ifrn.ifrn_name, "eth0", IFNAMSIZ);
      if (setsockopt(sock, SOL_SOCKET, SO_BINDTODEVICE, &amp;Interface, sizeof(Interface))&lt;0)
          close(sock);
  
      //open the RAW socket for sendto
      int s = socket (AF_INET6, SOCK_RAW, 255);
      struct sockaddr_in6 sin6; 
      memset(&amp;sin6,0,sizeof(sin6));
      sin6.sin6_family = AF_INET6;
      sin6.sin6_port = htons(0);
      memcpy(sin6.sin6_addr.s6_addr, mys6_addr, sizeof(mys6_addr));
      //bind the sock descriptor with eth0
      memset(&amp;Interface1, 0, sizeof(Interface1));
      strncpy(Interface1.ifr_ifrn.ifrn_name, "eth0", IFNAMSIZ);
      if (setsockopt(s, SOL_SOCKET, SO_BINDTODEVICE, &amp;Interface1, sizeof(Interface1)) &lt; 0) {
          close(s);
      }
      while (1) {
  
          printf("----------------------\n");
          i = recv(sock, buffer, sizeof(buffer), 0);
          printf("%d bytes read\n", i);
          // check header size: Ethernet = 14, IP = 20, TCP = 8 (sum = 42)
          i=43;
          if (i &lt; 42) {
              perror("recvfrom():");
              printf("Incomplete packet (errno is %d)\n", errno);
              close(sock);
              exit(0);
          }
          phead = buffer + 14; // (skip ethernet  header)
          memcpy(tbuff,phead,i-14); 
          iphead=tbuff;
          if (*iphead == 0x45) {
              int ptrindex= iphead[9];
              switch(ptrindex){
  
              case 1:
              printf("The transport protocl is:ICMP\n");
              break;
              case 2:
              printf("The transport protol is:IGMP\n");
              break;
              case 6:
              printf("The transport protocol is:TCP\n");
              break;
              case 17:
              printf("The transport protocol is:UDP\n");
              break;
              case 103:
              printf("The transport protocol is:PIM\n"); 
              break; 
              default:
              printf("The transport protocol is:%d\n",iphead[9]);
          }           
          //printf("%d",*ptrindex);
          // printf("\n The transport protocol is :%u\n",iphead[9]); 
          printf("Source Address: %d.%d.%d.%d, Port: %d\n",
          iphead[12], iphead[13], iphead[14], iphead[15], (iphead[20] &lt;&lt; 8) + iphead[21]);
          printf("Dest Address: %d.%d.%d.%d, Port: %d\n",
          iphead[16], iphead[17], iphead[18], iphead[19], (iphead[22] &lt;&lt; 8) + iphead[23]);
  
  
          /* if(sendto(s,tbuff,i-14,0,(struct sockaddr_in6 *)&amp;sin6,sizeof(sin6))&lt;0)
          printf("error\n"); */
  
          if(send(s,tbuff,i-14,0)&lt;0) {
              printf("error\n");
  
          } else {
              printf("\nThe received packet is send\n");
          }
  
          memset(buffer,0,sizeof(buffer));
          memset(tbuff,0,sizeof(tbuff));
  
          } else{
              printf("The non ip had received");
          }
  
      }
      close(sock);
      return 0;
  } 
  </code></pre>
  
  <p>The most of code is part of a question that i have read, but now i don't remembert what was. This program go in deadlock at printf("----------------\n"). Why? Can you help me?</p>