This discussion has been locked.
You can no longer post new replies to this discussion. If you have a question you can start a new discussion

Non-blocking BSD socket - fast reconnect problem

Hi

Parents
  • __task void bsd_tcp_server(void)
    {
       SOCKADDR_IN addr;
       unsigned long sck_mode = 1;
    
       int32_t sock, sd, res;
       char buf[256];
    
       while (1)
       {
          if ((sock = socket (AF_INET, SOCK_STREAM, 0)) > 0)
          {
             addr.sin_port        = htons(1000);
             addr.sin_family      = PF_INET;
             addr.sin_addr.s_addr = INADDR_ANY;
    
             if ((res = bind(sock, (SOCKADDR *)&addr, sizeof(addr))) == SCK_SUCCESS)
             {
                if ((res = listen(sock, 1)) == SCK_SUCCESS)
                {
                   sd = accept(sock, NULL, NULL);
                   closesocket(sock);
    
                   if (sd > 0)
                   {
                      sock = sd;
    
                      if (ioctlsocket (sock, FIO_DELAY_ACK, &sck_mode) == SCK_SUCCESS)
                      {
                         if (ioctlsocket (sock, FIONBIO, &sck_mode) == SCK_SUCCESS)
                         {
                            while (1)
                            {
                               res = recv(sock, buf, sizeof(buf), 0);
    
                               if ((res <= 0) && (res != SCK_EWOULDBLOCK) && (res!=SCK_ELOCKED))
                               {
                                  break;
                               }
    
                               else if (res > 0)
                               {
                                  // analyse request, send response
                                  // if send() returns error, close socket
                                  if (analyse_response(sock, (uint8_t *) buf, res) < 0)
                                  {
                                     close_nonblocking_socket(sock);
                                     break;
                                  }
                               }
    
                               os_dly_wait(25);
    
                               // if there is pending event, perform send()
                               // if send() returns error, close socket
                               if (send_status_update(sock) < 0)
                               {
                                  close_nonblocking_socket(sock);
                                  break;
                               }
                            }
                         }
                      }
                   }
                }
             }
    
             closesocket(sock);
          }
          os_dly_wait(25);
       }
    }
    

Reply
  • __task void bsd_tcp_server(void)
    {
       SOCKADDR_IN addr;
       unsigned long sck_mode = 1;
    
       int32_t sock, sd, res;
       char buf[256];
    
       while (1)
       {
          if ((sock = socket (AF_INET, SOCK_STREAM, 0)) > 0)
          {
             addr.sin_port        = htons(1000);
             addr.sin_family      = PF_INET;
             addr.sin_addr.s_addr = INADDR_ANY;
    
             if ((res = bind(sock, (SOCKADDR *)&addr, sizeof(addr))) == SCK_SUCCESS)
             {
                if ((res = listen(sock, 1)) == SCK_SUCCESS)
                {
                   sd = accept(sock, NULL, NULL);
                   closesocket(sock);
    
                   if (sd > 0)
                   {
                      sock = sd;
    
                      if (ioctlsocket (sock, FIO_DELAY_ACK, &sck_mode) == SCK_SUCCESS)
                      {
                         if (ioctlsocket (sock, FIONBIO, &sck_mode) == SCK_SUCCESS)
                         {
                            while (1)
                            {
                               res = recv(sock, buf, sizeof(buf), 0);
    
                               if ((res <= 0) && (res != SCK_EWOULDBLOCK) && (res!=SCK_ELOCKED))
                               {
                                  break;
                               }
    
                               else if (res > 0)
                               {
                                  // analyse request, send response
                                  // if send() returns error, close socket
                                  if (analyse_response(sock, (uint8_t *) buf, res) < 0)
                                  {
                                     close_nonblocking_socket(sock);
                                     break;
                                  }
                               }
    
                               os_dly_wait(25);
    
                               // if there is pending event, perform send()
                               // if send() returns error, close socket
                               if (send_status_update(sock) < 0)
                               {
                                  close_nonblocking_socket(sock);
                                  break;
                               }
                            }
                         }
                      }
                   }
                }
             }
    
             closesocket(sock);
          }
          os_dly_wait(25);
       }
    }
    

Children