title: UDP Sockets on Linux; send successfully but unable to receive large buffer
body: <p>I have two machines, that I would like both of them to communicate using sockets under C programming language.</p>
  
  <p>I have developed two samples to represent both sides but I noticed that I can send data successfully if they are smaller than certain number.</p>
  
  <p>The size that I have tested but does not work is sending &amp; receiving 2048 bytes , on contrary, for other smaller sizes such as 258 Bytes, 1KByte it works fine.</p>
  
  <p>After doing some investigations, I found out that, the sending operation has no errors while for the reception, I did not get any thing at all.</p>
  
  <p>I have checked the sending and receiving buffer sizes on both machines and I guess they are sufficient.</p>
  
  <p>Here are the first side of my code:</p>
  
  <pre><code>/* UDP client in the internet domain */
  #include &lt;sys/types.h&gt;
  #include &lt;sys/socket.h&gt;
  #include &lt;netinet/in.h&gt;
  #include &lt;arpa/inet.h&gt;
  #include &lt;netdb.h&gt;
  #include &lt;stdio.h&gt;
  #include &lt;stdlib.h&gt;
  #include &lt;unistd.h&gt;
  #include &lt;string.h&gt;
  #include &lt;assert.h&gt;
  
  #define BUFF_SIZE               1800
  #define MOBIPASS_L2_IP_ADDRESS  "192.168.13.53"
  #define MOBIPASS_L2_PORT_NUM    12001
  
  #define BRIDGE_IP_ADDRESS       "192.168.13.30"
  #define BRIDGE_PORT_NUM         12000
  
  #define RESTRICT_SRC_DST_NUM        1
  #define TEN_MSEC                    10000
  
  void error(const char *);
  void adjustSockParam (int sockFD);
  
  int main(int argc, char *argv[])
  {
  #if RESTRICT_SRC_DST_NUM
  
      int bridge_sock_fd = -1, n =-1;
      struct sockaddr_in server_mobipass, client_bridge;
      char buffer[BUFF_SIZE];
      char* choice = NULL;
      size_t size = 1;
  
      /* create socket descriptor at client machine*/
      bridge_sock_fd= socket(AF_INET, SOCK_DGRAM, IPPROTO_UDP);
      if (bridge_sock_fd &lt; 0) error("socket");
  
      /* *********************************************************
       * prepare source information of the socket file descriptor
       * *********************************************************
       */
      client_bridge.sin_family = AF_INET;
      client_bridge.sin_addr.s_addr=inet_addr(BRIDGE_IP_ADDRESS) ;
      client_bridge.sin_port = htons(BRIDGE_PORT_NUM);
      if( bind( bridge_sock_fd, (struct sockaddr *) &amp;client_bridge, sizeof ( client_bridge ) ) &lt; 0 )
      {
          error( "bind" );
      }
  
  
      /* *********************************************************
       * prepare destination information of the socket file descriptor
       * *********************************************************
       */
      server_mobipass.sin_family = AF_INET;
      server_mobipass.sin_addr.s_addr=inet_addr(MOBIPASS_L2_IP_ADDRESS) ;
      server_mobipass.sin_port = htons(MOBIPASS_L2_PORT_NUM);
      if( connect( bridge_sock_fd, (struct sockaddr *) &amp;server_mobipass, sizeof ( server_mobipass ) ) &lt; 0 ) {
          error("connect");
      }
  
      adjustSockParam(bridge_sock_fd);
      do
      {
          printf("sending traffic?[y/n]\n");
          getline(&amp;choice,&amp;size,stdin);
          if(*choice=='n')
              break;
  
          strncpy( buffer,
                      "Hello Mobipass, this is bridge :)\n",
                      sizeof(buffer));
          n = send( bridge_sock_fd, buffer, sizeof(buffer), MSG_CONFIRM  );
          if( n &lt; 0 )
          {
              error( "send" );
          }
  
          assert(n == sizeof(buffer));
  
          usleep(TEN_MSEC);
          /*memset(buffer,0 , sizeof(buffer));
  
          if( recv( bridge_sock_fd, buffer, sizeof(buffer), 0 ) &lt; 0 )
          {
              error( "recv" );
          }
          else
          {
              printf("Msg received from mobipass is:\n%s",buffer);
          }*/
  
  
      }while(*choice == 'y' || *choice == 'Y');
  
      close( bridge_sock_fd );
  
  #else
     int tx_sock, n, rx_sock;
     unsigned int srv_length;
     struct sockaddr_in server_mobipass, from, server_bridge;
     char buffer[256];
  
     /* create socket descriptor at client machine*/
     tx_sock= socket(AF_INET, SOCK_DGRAM, 0);
     if (tx_sock &lt; 0) error("socket");
  
     srv_length=sizeof(struct sockaddr_in);
  
     /*prepare server (peer entity) of UDP connection*/
     server_mobipass.sin_family = AF_INET;
     server_mobipass.sin_addr.s_addr=inet_addr(MOBIPASS_L2_IP_ADDRESS) ;
     server_mobipass.sin_port = htons(MOBIPASS_L2_PORT_NUM);
  
     printf("Please enter the message: ");
     bzero(buffer,256);
     fgets(buffer,255,stdin);
  
     n=sendto(tx_sock,buffer,
              strlen(buffer),0,(const struct sockaddr *)&amp;server_mobipass,srv_length);
     if (n &lt; 0) error("Sendto");
  
     rx_sock= socket(AF_INET, SOCK_DGRAM, 0);
     if (rx_sock &lt; 0) error("socket");
  
     server_bridge.sin_family =  AF_INET;
     server_bridge.sin_addr.s_addr = inet_addr(BRIDGE_IP_ADDRESS);
     server_bridge.sin_port = htons(BRIDGE_PORT_NUM);
     if (bind(rx_sock,(struct sockaddr *)&amp;server_bridge,srv_length)&lt;0)
            error("binding");
  
     n = recvfrom(rx_sock,buffer,256,0,(struct sockaddr *)&amp;from, &amp;srv_length);
     if (n &lt; 0) error("recvfrom");
  
     /*print to stdout what have been received*/
     write(1,"Got an ack: ",12);
     write(1,buffer,n);
  
  
  
  
  
     /* close sockets */
     close(rx_sock);
     close(tx_sock);
  
  #endif /* RESTRICT_SRC_DST_NUM */
     return 0;
  }
  
  void error(const char *msg)
  {
      perror(msg);
      exit(0);
  }
  
  void adjustSockParam (int sockFD)
  {
  
      int option_value;
      socklen_t option_len = sizeof(option_value);
  
      /** Adjust Send Buffer Size**/
      if( getsockopt(sockFD, SOL_SOCKET, SO_SNDBUF,
             &amp;option_value, &amp;option_len)&lt; 0)
      {
          error("get Socket Option error:");
      }
      printf("Initial SO_SNDBUF: option_len = %d option_value = %d\n",option_len,option_value);
  
      /*option_value = 2048;
      if( setsockopt(sockFD, SOL_SOCKET, SO_SNDBUF,
             &amp;option_value, option_len)&lt; 0)
      {
          error("get Socket Option error:");
      }
  
      if( getsockopt(sockFD, SOL_SOCKET, SO_SNDBUF,
             &amp;option_value, &amp;option_len)&lt; 0)
      {
          error("get Socket Option error:");
      }
      printf("Final SO_SNDBUF: option_len = %d option_value = %d\n",option_len,option_value);*/
  
      /** Adjust Receiver Buffer Size **/
      if( getsockopt(sockFD, SOL_SOCKET, SO_RCVBUF,
                 &amp;option_value, &amp;option_len)&lt; 0)
          {
              error("get Socket Option error:");
          }
          printf("Initial SO_RCVBUF: option_len = %d option_value = %d\n",option_len,option_value);
  }
  </code></pre>
  
  <p>Here are the second side of my code:</p>
  
  <pre><code>#include &lt;sys/types.h&gt;
  #include &lt;stdlib.h&gt;
  #include &lt;unistd.h&gt;
  #include &lt;sys/socket.h&gt;
  #include &lt;netinet/in.h&gt;
  #include &lt;string.h&gt;
  #include &lt;netdb.h&gt;
  #include &lt;stdio.h&gt;
  #include &lt;assert.h&gt;
  
  #define BUFF_SIZE               1800
  #define MOBIPASS_L2_IP_ADDRESS  "192.168.13.53"
  #define MOBIPASS_L2_PORT_NUM    12001
  
  #define BRIDGE_IP_ADDRESS       "192.168.13.30"
  #define BRIDGE_PORT_NUM         12000
  
  #define DUMP                        0
  #define ACT_AS_STRING               0
  #define RESTRICT_SRC_DST_NUM        1
  #define TEN_MSEC                    10000
  
  #if DUMP
      #define DUMP_BUFFER(buf,len)                \
      {                                           \
          int i;                                  \
          for(i = 0; i &lt; len; i++)                \
              printf("buf[%d] = 0x%x",i,buf[i]);  \
      }
  #else
      #define DUMP_BUFFER(buf,len)        printf("received len=%d\n",len)
  #endif
  
  void adjustSockParam (int sockFD);
  void error(const char *msg)
  {
      perror(msg);
      exit(0);
  }
  
  int main(int argc, char *argv[])
  {
  #if RESTRICT_SRC_DST_NUM
      int mobipass_sock_fd = -1;
      struct sockaddr_in server_mobipass, client_bridge;
      char buffer[BUFF_SIZE];
      int recivedBytes=-1;
  
      printf("size of buffer = %d\n",sizeof(buffer));
      /* create socket descriptor at client machine*/
      mobipass_sock_fd= socket(AF_INET, SOCK_DGRAM, IPPROTO_UDP);
      if (mobipass_sock_fd &lt; 0) error("socket");
  
      /* *********************************************************
       * prepare source information of the socket file descriptor
       * *********************************************************
       */
      client_bridge.sin_family = AF_INET;
      client_bridge.sin_addr.s_addr=inet_addr(MOBIPASS_L2_IP_ADDRESS) ;
      client_bridge.sin_port = htons(MOBIPASS_L2_PORT_NUM);
      if( bind( mobipass_sock_fd, (struct sockaddr *) &amp;client_bridge, sizeof ( client_bridge ) ) &lt; 0 )
      {
          error( "bind" );
      }
  
  
      /* *********************************************************
       * prepare destination information of the socket file descriptor
       * *********************************************************
       */
      server_mobipass.sin_family = AF_INET;
      server_mobipass.sin_addr.s_addr=inet_addr(BRIDGE_IP_ADDRESS) ;
      server_mobipass.sin_port = htons(BRIDGE_PORT_NUM);
      if( connect( mobipass_sock_fd, (struct sockaddr *) &amp;server_mobipass, sizeof ( server_mobipass ) ) &lt; 0 ) {
          error("connect");
      }
  
      adjustSockParam(mobipass_sock_fd);
  
      printf("waiting for message from bridge:\n");
      do{
          memset(buffer,0 , sizeof(buffer));
          recivedBytes = recv( mobipass_sock_fd, buffer, sizeof(buffer), 0 );
          if( recivedBytes  &lt; 0 )
          {
              error( "recv" );
          }
          else
          {
              assert(recivedBytes == sizeof(buffer));
              DUMP_BUFFER(buffer,recivedBytes);
  #if ACT_AS_STRING
              printf("Msg received from bridge is:\n%s",buffer);
  #endif
          }
          usleep(TEN_MSEC);
  #if ACT_AS_STRING
          strncpy( buffer,
                      "Hello Bridge, this is mobipass :)\n",
                      sizeof(buffer));
          if( send( mobipass_sock_fd, buffer, sizeof(buffer), 0 ) &lt; 0 )
          {
              error( "send" );
          }
  #endif
      }while(1);
  
      close( mobipass_sock_fd );
  
  #else
      int tx_sock, n, rx_sock;
      unsigned int srv_length;
      socklen_t fromlen;
      struct sockaddr_in server_mobipass, from, server_bridge;
      char buf[1024];
  
  
      rx_sock=socket(AF_INET, SOCK_DGRAM, 0);
      if (rx_sock &lt; 0) error("Opening socket");
      else printf("Creating rx udp socket\n");
  
      srv_length = sizeof(server_mobipass);
      bzero(&amp;server_mobipass,srv_length);
  
      server_mobipass.sin_family=AF_INET;
      server_mobipass.sin_addr.s_addr=inet_addr(MOBIPASS_L2_IP_ADDRESS);
      server_mobipass.sin_port=htons(MOBIPASS_L2_PORT_NUM);
  
      if (bind(rx_sock,(struct sockaddr *)&amp;server_mobipass,srv_length)&lt;0)
      error("binding");
      else
      printf("Binding a socket to a server IP address\n");
      fromlen = sizeof(struct sockaddr_in);
  
      tx_sock=socket(AF_INET, SOCK_DGRAM, 0);
      if (tx_sock &lt; 0) error("Opening socket");
      else printf("Creating tx udp socket\n");
  
      server_bridge.sin_family=AF_INET;
      server_bridge.sin_addr.s_addr=inet_addr(BRIDGE_IP_ADDRESS);
      server_bridge.sin_port=htons(BRIDGE_PORT_NUM);
  
      while (1)
      {
      printf("waiting for a message from client side:\n");
      n = recvfrom(rx_sock,buf,1024,0,(struct sockaddr *)&amp;from,&amp;fromlen);
      if (n &lt; 0) error("recvfrom");
  
      write(1,"Message received from eNB machince:\n",36);
      write(1,buf,n);
  
      n = sendto(tx_sock,"hello eNB, I am mobipass\n",27,
                0,(struct sockaddr *)&amp;server_bridge,fromlen);
      if (n  &lt; 0) error("sendto");
      }
  
  #endif
      return 0;
   }
  
  void adjustSockParam (int sockFD)
  {
  
      int option_value;
      socklen_t option_len = sizeof(option_value);
  
      /** Adjust Send Buffer Size**/
      if( getsockopt(sockFD, SOL_SOCKET, SO_SNDBUF,
             &amp;option_value, &amp;option_len)&lt; 0)
      {
          error("get Socket Option error:");
      }
      printf("Initial SO_SNDBUF: option_len = %d option_value = %d\n",option_len,option_value);
  
  /*  option_value = 2048;
      if( setsockopt(sockFD, SOL_SOCKET, SO_SNDBUF,
             &amp;option_value, option_len)&lt; 0)
      {
          error("get Socket Option error:");
      }
  
      if( getsockopt(sockFD, SOL_SOCKET, SO_SNDBUF,
             &amp;option_value, &amp;option_len)&lt; 0)
      {
          error("get Socket Option error:");
      }
      printf("Final SO_SNDBUF: option_len = %d option_value = %d\n",option_len,option_value);*/
  
      /** Adjust Receiver Buffer Size **/
      if( getsockopt(sockFD, SOL_SOCKET, SO_RCVBUF,
                 &amp;option_value, &amp;option_len)&lt; 0)
          {
              error("get Socket Option error:");
          }
          printf("Initial SO_RCVBUF: option_len = %d option_value = %d\n",option_len,option_value);
  }
  </code></pre>
  
  <p>Here is the output on first side:</p>
  
  <pre><code>Initial SO_SNDBUF: option_len = 4 option_value = 112640
  Initial SO_RCVBUF: option_len = 4 option_value = 112640
  sending traffic?[y/n]
  y
  sending traffic?[y/n]
  y
  </code></pre>
  
  <p>Here is the output on second side:</p>
  
  <pre><code>size of buffer = 1800
  Initial SO_SNDBUF: option_len = 4 option_value = 1048576
  Initial SO_RCVBUF: option_len = 4 option_value = 1048576
  waiting for message from bridge:
  </code></pre>
  
  <p>I am not sure what I am doing wrong here. Do you any suggestions?</p>