Hello, yesterday i have tested with this result. i think that the problem
can be other.

Remenber, i have 8 socket 1500h 1501h 1502h 1600h 1601h 1602h 1603h 1604h.

the accept connecttion works, but not always, 50%.

The recv: 1501h an 1502h OK but 1500h bad!! never recieve
The send: 1500h and 1600h bad, the rest sockets perfect
The close: 1500h and 1600h bad, the rest sockets perfect

My conclusion and i can´t proof the recv for the rest of socket, is that
socket 1500 and 1600 doesn´t work, only accept the connection but no always.
I don't known what happend, can be a problem of my customer copmputer?. My
connection is done with a router and connect my EVK1100 to PC by this router
connecting to internet.

thanks
Oscar

the file code

static int aSocket[NUM_SOCKET]; //Accepted Socket. Static global for other
task acce
static int lSocket[NUM_SOCKET]; //Local Socket
static char BufferRx[TAM_RX_RTU];
static struct sockaddr_in sLocalAddr[NUM_SOCKET];
static struct sockaddr_in sRemoteAddr[NUM_SOCKET];
static long AddressPCU;

static short State_TablePCU;
static short Mode_System;


//HEADER of function of connection
static void ProcessRequestPC_to_RTU (int s);
static void ProcessRequestPC_to_PCU (int s);
static void ProcessRequestPC_Finish (int s);
static void CloseConnectionPC(int *s1,int *s2 );
static void Send_ACK_or_NACK(int s,int tipo,int code );


portTASK_FUNCTION( vProtocolRTUServer, pvParameters )
{
    //Local variables of function ==> maybe put global
    int i,maxfd,ret,num_conexiones=0;
    fd_set readset;
    int
PortConnection[NUM_SOCKET]={0x1600,0x1500,0x1501,0x1502,0x1601,0x1602,0x1603,0x1604};
//the order is important

    //Initialization of variable global of the this task
    Mode_System=MODE_INIT;
    State_TablePCU=TABLE_EMPTY;

    //init_dbg_rs232(66000000);
    //Create the NUM_SOCKET=8 connection to wait the accept
    print_dbg(" Inicializando Sockets  \n");
    for(i=0;i<NUM_SOCKET;i++)
    {
          //Create the 8 socket
        lSocket[i] = lwip_socket(AF_INET, SOCK_STREAM, 0);
        if (lSocket[i]<0)
         return;

          //Bind to this socket
          memset((char *)&sLocalAddr[i], 0, sizeof(sLocalAddr[i]));
        sLocalAddr[i].sin_family = AF_INET;
        sLocalAddr[i].sin_len = sizeof(sLocalAddr[i]);
        sLocalAddr[i].sin_addr.s_addr = htonl(INADDR_ANY); //!!!!CUIDADO
SINO VALE CUALQUIER DIRECCION CAMBIAR!!!!
        sLocalAddr[i].sin_port = PortConnection[i]; //Ports of the table

        if (lwip_bind(lSocket[i],(struct sockaddr *)&sLocalAddr[i],
sizeof(sLocalAddr[i])) < 0)
         {
           //Error. Close the socket
           lwip_close(lSocket[i]);
           print_dbg(" Error en bind \n");

           return;
         }

        //Listen to the 8 socket.Maximum 1 connection for socket
        if ( lwip_listen(lSocket[i],1) != 0 )
         {
           lwip_close(lSocket[i]);
           print_dbg(" Error en listen \n");
           return;
         }
      }


    //Using of select function to wait for the accept connection

      print_dbg(" Sockets preprarados para entrar en el accept secuencial
\n");
      num_conexiones=0;
      do{

          aSocket[num_conexiones]= accept(lSocket[num_conexiones],(struct
sockaddr*)&sRemoteAddr[num_conexiones],(socklen_t *)sizeof(sRemoteAddr[0]));
          if (aSocket[num_conexiones]>0)
          {
            print_dbg("socket Aceptado: ");
            print_dbg_ulong(aSocket[num_conexiones]);
            print_dbg("\n socket Inicial: ");
            print_dbg_ulong(lSocket[num_conexiones]);
            print_dbg(" \n");
            num_conexiones++;
          }
          else
          {
              CloseConnectionPC(aSocket,lSocket );
              print_dbg(" Error en accept \n");
              return;
          }

      }while (num_conexiones<NUM_SOCKET);

 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]);

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

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

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




static void 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)
  {








  }
}

static void 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;
             print_dbg("Procesando RTU \n");
         } 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);
     print_dbg("\n");
      switch(code_command)
      {
       case ID_PCU_01:
                      if (Mode_System==MODE_INIT)
                      {
                       print_dbg("Comando Abrir la tabla PCU recibido \n ");
                       Send_ACK_or_NACK(aSocket[0],SEND_ACK,0);
                       //Reset Table
                       AddressPCU=ADDRESS_PCU;
                       State_TablePCU=TABLE_EMPTY;
                      }
                      else
                      {
                        print_dbg("No estamos en el modo INIT \n");
                        Send_ACK_or_NACK(aSocket[0],SEND_NACK,NO_MODE_INIT);
                      }
                      break;
       case ID_PCU_02:


                          break;
       case ID_PCU_03:

                          break;
       case ID_PCU_04:

                          break;


      }

}

static void  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 \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);
      print_dbg("\n");
      switch(code_command)
      {
        case ID_SPR_01:

                       Send_ACK_or_NACK(aSocket[0],SEND_ACK,0);

                       print_dbg(" Enviado ACK a socket ");
                       print_dbg_ulong(aSocket[0]);
                       print_dbg("\n");
                       print_dbg(" cerramos pero falla.Estudiar porque \n");
                       //close(s); uno solo funciona
                       CloseConnectionPC(aSocket,lSocket );
                       return;
      }

}


static void CloseConnectionPC(int *s1,int *s2 )
{
  int i;

    print_dbg("Ordenamos cerrar los Socket \n");
    for (i=2;i<NUM_SOCKET;i++)
    {
     close(s1[i]);

     //close(s2[i]);
    }
}

static void Send_ACK_or_NACK(int s,int tipo,int code )
{
  char BufferACK[12];
  long aux;

  aux=0x0000000C;
  memcpy(BufferACK, &aux, 4);
  aux=ID_ACK_01;
  memcpy(BufferACK+4, &aux, 4);

  if (tipo==SEND_ACK)
  {
    aux=0x00010000;
    memcpy(BufferACK+8,&aux, 4);

    print_dbg("Enviamos el comando ACK \n");
  }
  else
  {
    aux=0x0002;
    memcpy(BufferACK+8,&aux, 2);
    aux=code;
    memcpy(BufferACK+10,&aux, 2);
    print_dbg("Enviamos el comando NACK con error ");
    print_dbg_ulong(code);
    print_dbg("\n ");
  }
   //Send the command. Maybe i have to deal with the posible error.
   send(s, BufferACK, 12, 0);
}









On Mon, Oct 5, 2009 at 8:18 PM, Oscar F <[email protected]> wrote:

> Hello again, today i´ve tested several thing, and i have a little
> conclusión two port don´t work, port number 1500h and 1600h. It is very
> strange, because if i don´t touch this number i can send, recv and close
> this socket without problem.
>
> More strange is that let me to accept the connection to the all port
> including 1500 and 1600.
> any idea?
>
> Thanks
> Oscar
>
_______________________________________________
lwip-users mailing list
[email protected]
http://lists.nongnu.org/mailman/listinfo/lwip-users

Reply via email to