lwip-users
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

Re: [lwip-users] Recv en socket TCP


From: Oscar F
Subject: Re: [lwip-users] Recv en socket TCP
Date: Sun, 4 Oct 2009 09:39:51 +0200

Hello Again. i don´t know what happend, but i have tested all solution and don´t work always is blocked in recv.

I follow the call stack, because the debug mode doesn´t work at the moment, and this the result

9 _handle_Data_Address_Read()  0x8001fa34    //FAIL here is the last call
8 xTaskRemoveFromEventList() C:\Proyectos DAS\ProyectosAVRStudio32\Proyectos demos AVR32\Simulador_RTU\src\SOFTWARE_FRAMEWORK\SERVICES\FREERTOS\Source\tasks.c:1596 0x80012682   
7 xTaskRemoveFromEventList() C:\Proyectos DAS\ProyectosAVRStudio32\Proyectos demos AVR32\Simulador_RTU\src\SOFTWARE_FRAMEWORK\SERVICES\FREERTOS\Source\tasks.c:1596 0x80012682   
6 prvUnlockQueue() C:\Proyectos DAS\ProyectosAVRStudio32\Proyectos demos AVR32\Simulador_RTU\src\SOFTWARE_FRAMEWORK\SERVICES\FREERTOS\Source\queue.c:1056 0x80013358   
5 xQueueGenericSend() C:\Proyectos DAS\ProyectosAVRStudio32\Proyectos demos AVR32\Simulador_RTU\src\SOFTWARE_FRAMEWORK\SERVICES\FREERTOS\Source\queue.c:539 0x80012ee8   
4 sys_sem_signal() C:\Proyectos DAS\ProyectosAVRStudio32\Proyectos demos AVR32\Simulador_RTU\src\NETWORK\lwip-port\AT32UC3A\sys_arch.c:138 0x80016eca   
3 do_recv() C:\Proyectos DAS\ProyectosAVRStudio32\Proyectos demos AVR32\Simulador_RTU\src\SOFTWARE_FRAMEWORK\SERVICES\lwip-1.3.0\src\api\api_msg.c:923 0x80011156   
2 tcpip_thread() C:\Proyectos DAS\ProyectosAVRStudio32\Proyectos demos AVR32\Simulador_RTU\src\SOFTWARE_FRAMEWORK\SERVICES\lwip-1.3.0\src\api\tcpip.c:271 0x8000ed84   
1 <symbol is not available> 0xdeadbeef   

Do you know what is the cause of the problem?

Another thing:
I have deleted the task WEB and TFTP example and now that i have more memory the problem appear more frecuency in the connection of the accept socket:
always don´t fetch a _malloc instruction. I´ll put the call stack the nex time

Thanks
Oscar










On Thu, Oct 1, 2009 at 8:17 AM, Oscar F <address@hidden> wrote:
Thank you again Kieran, first i would tell you the situation today.

i have three socket, i received data of two and fail in the other. The size of the buffer today is 2048, but i have a message of 12000 bytes. In this moment i can´t declare this buffer because the application crack and RTOS don´t enter. this is my other problem and i hope solve too.

I have tested to define a little buffer ( 10 bytes ) but recv( ) don´t enter in this socket. i don´t understand because in two socket work!! and in the other no.

The other solution (" make recv non-blocking") should test, but one question: If enter in the fucntion and the size received is not the total, select wait again, no ? and i only would have to do the call to recv (not blocking ) until the lengh of the message is total received.

please , if i want to define a big buffer 12000, what variable of config i have to change in RTOS and lwipopts should i change. My micro is AT32UC3A0512 and i think i have enough memory ( 512 Kb falsh and 64K of SRAM). today the program need 200Kbytes en flash. Maybe i need to define the buffer in internal flash and not in the RAM memory. I not sure but this declaration fail:
static portCHAR BufferRx[TAM_RX_RTU];  TAM_RX_RTU=2048.
Any advice?

Regards
Thanks
Oscar

The CODE today:

while(1){

          FD_ZERO(&readset);
          maxfd=0;
          print_dbg(" Metemos los 3 Sockets por donde podemos recibir para entrar en el select \n");
          for(i=1;i<4;i++)
           {
             FD_SET(aSocket[i], &readset);
             print_dbg("socket : ");
             print_dbg_ulong(aSocket[i]);
             print_dbg("\n ");

             if (aSocket[i]> maxfd)
              maxfd = aSocket[i];
           }




          // Check for received packets on configured sockets (blocking )
          ret = select(maxfd+1, &readset, NULL, NULL, NULL);

          print_dbg("select ha entrado \n");


          if (ret > 0) //No error
            {
              //Check data for socket 1
              if (FD_ISSET(aSocket[1], &readset))
                ProcessRequestPC_to_RTU(aSocket[1]); //DON¨T RECEIVE


              //Check data for socket 2
              if (FD_ISSET(aSocket[2], &readset))
               ProcessRequestPC_to_PCU(aSocket[2]); //RECEIVE OK


              //Check data for socket 3
              if (FD_ISSET(aSocket[3], &readset))
               ProcessRequestPC_Finish(aSocket[3]); //RECEIVE OK

            }
          else
          {
              print_dbg(" Error en select \n");
              CloseConnectionPC(aSocket,lSocket );
              return;

          }
          }
          }


void static ProcessRequestPC_to_RTU (int s)
{
 int result,nbytesRx;
 long code_command,length_command;

  print_dbg("Recibido mensaje RTU \n");
  nbytesRx=0; //Total=0;

  result = recv(s, BufferRx, TAM_RX_RTU, 0);

  if (result<=0) //Error or close connection
   {
    print_dbg("Fallo Recv \n");

    CloseConnectionPC(aSocket,lSocket );
    return;
   }
  nbytesRx+=result; //Byte received
  print_dbg("Procesando RTU 1 \n");

  //Calculate the Length. ¡¡¡¡¡ I supposed that 4 byte are received always TAKE CARE!!!!!!!
  memcpy(&length_command, BufferRx, LENGHT_RX);
  if (length_command!=nbytesRx)
  {
   do{
       result = recv(s, BufferRx+nbytesRx, length_command-nbytesRx, 0);
       if (result<=0) //Error or close connection
          {
           print_dbg("Fallo Recv \n");
           CloseConnectionPC(aSocket,lSocket );
           return;
          }
       print_dbg("Procesando RTU 2 \n");

       nbytesRx+=result;

     } while (nbytesRx<length_command);
  }
  //All message is received
  memcpy(&code_command, BufferRx+LENGHT_RX,L_CODE_RX); //copy the code of message

  switch(code_command)
  {


  }
}

void static ProcessRequestPC_to_PCU (int s)

{
    int result,nbytesRx;
     long code_command,length_command;

     print_dbg("Recibido mensaje PCU \n");
     nbytesRx=0;

      result = recv(s, BufferRx, TAM_RX_RTU, 0);
      if (result<=0)
       {
        print_dbg("Fallo Recv \n");

        CloseConnectionPC(aSocket,lSocket );
        return;
       }
      nbytesRx+=result;

      //Calculate the Length

      memcpy(&length_command, BufferRx, LENGHT_RX);
      if (length_command!=nbytesRx)
      {
       do{
           result = recv(s, BufferRx+nbytesRx, length_command-nbytesRx, 0);
           if (result<=0)
              {
               print_dbg("Fallo Recv \n");

               CloseConnectionPC(aSocket,lSocket );
               return;
              }
             nbytesRx+=result;

         } while (nbytesRx<length_command);
      }
      //All message is received
      memcpy(&code_command, BufferRx+LENGHT_RX, L_CODE_RX); //copy the code of message

      switch(code_command)
      {


      }

}

void static ProcessRequestPC_Finish (int s)

{
    int result,nbytesRx;
    long code_command,length_command;

     print_dbg("Recibido mensaje Finish \n");
     nbytesRx=0;

      result = recv(s, BufferRx, TAM_RX_RTU, 0);
      if (result<=0)
       {
        print_dbg("Fallo Recv \n");

        CloseConnectionPC(aSocket,lSocket );
        return;
       }
      nbytesRx+=result;

      print_dbg("Procesando finish 1 \n");
      //Calculate the Length

      memcpy(&length_command, BufferRx, LENGHT_RX);
      if (length_command!=nbytesRx)
      {
       do{
           result = recv(s, BufferRx+nbytesRx, length_command-nbytesRx, 0);
           if (result<=0)
              {
               print_dbg("Fallo Recv \n");
               CloseConnectionPC(aSocket,lSocket );
               return;
              }
             print_dbg("Procesando finish 2 \n");

             nbytesRx+=result;

         } while (nbytesRx<length_command);
      }
      //All message is received
      memcpy(&code_command, BufferRx+LENGHT_RX, L_CODE_RX); //copy the code of message
      print_dbg("Comando recibido= ");
      print_dbg_ulong(code_command);
      print_dbg("\n Longitud= ");
      print_dbg_ulong(length_command);
      switch(code_command)
      {
        case ID_SPR_01:
                       print_dbg("\n cerramos pero falla");
                       CloseConnectionPC(aSocket,lSocket );
                       return;

      }

}















On Wed, Sep 30, 2009 at 4:44 PM, Kieran Mansley <address@hidden> wrote:
On Wed, 2009-09-30 at 12:48 +0200, Oscar F wrote:
> Hello again, the problem continous, in this moment i have achived
> accept the connection, then i have inserted in a select struct the
> three request socket .
>
> When the customer send me a request i awake in select, but i can read
> anything, the program block in recv. The size of this reception is
> variable, in my first connection i ´must receive 10 bytes.

My guess is that you're stuck in this bit:

>   result = recv(s, BufferRx,sizeof(BufferRx), 0);    //Block the
> program and i saw with wireshark that the message is full with 10
> bytes

What is sizeof(BufferRx)?  The recv() function may block waiting for the
buffer to be full, so if you have given it a large buffer, you could
have to wait a while for it to fill up and return.  If I remember from
your earlier posts you don't have much memory allocated to network
buffers, so it may be that there are just not enough network buffers to
hold that amount of data, and it never gets full, and recv never
returns.

You could either:
 1) give a smaller length argument to recv() - it sounds like you only
want 10 bytes of data, so give it the value 10.
 2) make recv non-blocking by passing the MSG_DONTWAIT flag in the flags
argument - it will then return whatever data it can get (which may be
nothing, but as select has said there is some it should return
something).

Kieran



_______________________________________________
lwip-users mailing list
address@hidden
http://lists.nongnu.org/mailman/listinfo/lwip-users



reply via email to

[Prev in Thread] Current Thread [Next in Thread]