Jump to content

    

Вопросы по LWIP

Приветствую.

Накопилось пару вопросов и непоняток. В инете примеры в основном серверов, а меня интересует "клиент".

Собственно, пока требовалось только одно соединение в данный момент все работало как надо но встала задача нескольких соединений с удаленными серверами и тут начались сюрпризы...

Запускаю соединениен с удаленным сервером,IP адрес начинается на 88, затем, пока идет соединение с первым сервером,
запускаю второе (IP адрес начинается на 192) ...

uint32_t TCP_SocketCliInit(uint16_t  num)
{
struct ip_addr server_ip;
IP4_ADDR(&server_ip, TCP_Sock[num].IP_Adr[0],TCP_Sock[num].IP_Adr[1],TCP_Sock[num].IP_Adr[2],TCP_Sock[num].IP_Adr[3]);
TCP_SockPCB[num] = tcp_new();
if (TCP_SockPCB[num]==NULL) {return 1;}//out of mem
TCP_Sock[num].SocketVarIntr=TCP_Sock[num].SocketVar;
tcp_recv(TCP_SockPCB[num], TCP_SockCliReceive);
tcp_sent(TCP_SockPCB[num], TCP_SockCliSending);
tcp_connect(TCP_SockPCB[num], &server_ip, TCP_Sock[num].PortNum, TCP_Sock_connected);

printf( "Cli REQ CONN: %d Adr:%d, PCB:%d, IP0:%d\n", num,TCP_Sock[num].SocketVar,TCP_SockPCB[num],TCP_Sock[num].IP_Adr[0]);

return 0;


 

и вижу чудеса, оказывается они оба закинулись на одну и ту же PCB.
В результате передача встает "колом". Т.е. пока нет соединения, я второе запустить не могу?
 

Cli REQ CONN: 0 Adr:396416180, PCB:382828968, IP0:88
Cli REQ CONN: 1 Adr:396416184, PCB:382828968, IP0:192
Cli CONNECT: 0 Adr:396416180
TCP_SOCK Cli Send_OK: 0 Adr:396416180, PCB:382828968
 

 

И второй вопрос, при запуске соединения к удаленному серверу, оно какое-то время пытается установиться,
 а потом отваливается. Если я его закрываю, пока идет это время, все закрывается корректно, но если после 
- выпадаю в ассерт. Не нашел ничего лучшего, как проверку активных соединений.
 Правильно так делать, или надо как-то по-другому?

 

void TCP_SockCliReleaseSession( struct tcp_pcb *pxPCB,char mode)
{
  uint16_t          i=0;
  struct            tcp_pcb *pcb;
  
  while (i<MAX_TCP_Sessions) {if ((pxPCB==TCP_SockPCB[i])&&(TCP_Sock[i].Type==TCP_TypeCliSession)) break;i++;}
 
  
  if ((pxPCB != NULL)&&(i<MAX_TCP_Sessions))
    {
      
      if ((pxPCB == TCP_SockPCB[i])&&(TCP_SockPCB[i]!=NULL))
        {
         //printf("\n<%d>tcp_close<%d>--%p\r\n",i,pxPCB->state,(void*)pxPCB);
         tcp_arg(pxPCB, NULL);
         tcp_recv(pxPCB, NULL);
         tcp_err(pxPCB, NULL);
         tcp_sent(pxPCB, NULL);
         
         for(pcb = tcp_active_pcbs; pcb != NULL; pcb = pcb->next) 
           {
            if (pxPCB == pcb) 
              {
#ifdef TCP_SOCK_DEBUG
               printf ("CLOSE ACTIVE --- <%p>---\n",pcb);
#endif
               if( tcp_close( pxPCB ) != ERR_OK) {tcp_abort( pxPCB );}
               break;
              }
           }
        }


 

Share this post


Link to post
Share on other sites

Create an account or sign in to comment

You need to be a member in order to leave a comment

Create an account

Sign up for a new account in our community. It's easy!

Register a new account

Sign in

Already have an account? Sign in here.

Sign In Now