Jump to content

    
Sign in to follow this  
mantech

Вопросы по LWIP

Recommended Posts

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

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

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

Запускаю соединениен с удаленным сервером,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

Join the conversation

You can post now and register later. If you have an account, sign in now to post with your account.

Guest
Reply to this topic...

×   Pasted as rich text.   Paste as plain text instead

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   Your previous content has been restored.   Clear editor

×   You cannot paste images directly. Upload or insert images from URL.

Sign in to follow this