안녕하세요. 임베디드 관련 자료를 찾아보다가 좋은 글이 많아 공부할겸 가입하게 되었습니다.

(에구...처음이라 그런지 글을 잘못 올렸네요... 수정했습니다.)


http://forum.falinux.com/zbxe/index.php?document_srl=406054&mid=network_programming


위의 링크의 글을 보고 보드에다가 소켓 프로그래밍을 해서 간단한 테스트를 했습니다. 


보드는 STR912x 계열이구요. FreeRTOS를 바탕으로 해서 ewarm 사용해서 프로그래밍 중에 있습니다.


그런데 TCP/IP 서버가 잘되다가  accept 부분에서 클라이언트(pc)와 connect 하지 못하고 죽어버리는데 


어떤 문제 때문에 그런건지...어떻게 해결을 해나가야 할지 감이 안 잡혀서 질문 드립니다.


일단 제가 시도한건 서버였지만 혹시나 해서 클라이언트로 프로그래밍해서 보드에서 동작시켜버리니...이건 되네요...


아래는 서버 코드 입니다. 작은 도움이라도 주시면 감사하겠습니다.


void main()

{  

    ...(생략)...

 

vlwIPInit();

sys_set_state( ( signed char * ) "LwIpSocket", lwIpTCP_CLIENT_STACK_SIZE); //STACK_SIZE=350

sys_thread_new( vBasicTCPServer, ( void * ) NULL, tskIDLE_PRIORITY + 5 );

sys_set_default_state();


   ...(생략)...

}


void vBasicTCPServer( void *pvParameters )

{

extern err_t ethernetif_init( struct netif *netif );


 

    emacIPADDR0      = ***;

    emacIPADDR1      = ***;

    emacIPADDR2      = 0;

    emacIPADDR3      = 43;


    emacNETMASK0      = 255;

    emacNETMASK1      = 255;

    emacNETMASK2      = 255;

    emacNETMASK3      = 0;

    

    emacGATEWAYADDR0  = ***;

    emacGATEWAYADDR1  = ***;

    emacGATEWAYADDR2  = 0;

    emacGATEWAYADDR3  = 1;


    /* Parameters are not used - suppress compiler error. */

    ( void ) pvParameters;  

  


    /* Create and configure the EMAC interface. */

    IP4_ADDR( &xIpAddr, emacIPADDR0, emacIPADDR1, emacIPADDR2, emacIPADDR3 );

    IP4_ADDR( &xNetMast, emacNETMASK0, emacNETMASK1, emacNETMASK2, emacNETMASK3 );

    IP4_ADDR( &xGateway, emacGATEWAYADDR0, emacGATEWAYADDR1, emacGATEWAYADDR2, emacGATEWAYADDR3 );

    netif_add( &EMAC_if, &xIpAddr, &xNetMast, &xGateway, NULL, ethernetif_init, tcpip_input );


    /* make it the default interface */

    netif_set_default( &EMAC_if );


    /* bring it up */

    netif_set_up(&EMAC_if);


    /* Initialize*/

    TCPtestServer();

    /* Nothing else to do.  No point hanging around. */

    vTaskDelete( NULL );

}


void TCPtestServer( void  )

{    

  unsigned char strHostIp[20];


   int   server_socket;

   int   client_socket;

   int   client_addr_size;

   

   int   chk_snd;

   int   chk_rcv;


   struct sockaddr_in   server_addr;

   struct sockaddr_in   client_addr;


   char   buff_rcv[BUFF_SIZE+5]; // buff_size =1024  @ 이부분은 함수 밖으로 빼냈습니다.

   char   buff_snd[BUFF_SIZE+5]; //   참고 용으로 넣어둔겁니다. 무시하셔도 됩니다.

     

     

   server_socket  = socket( PF_INET, SOCK_STREAM, 0);

   if( -1 == server_socket)

   {

      xPrintf( "\n -> server socket create failed \n");

       vTaskDelay(1000 / portTICK_RATE_MS);

      close( server_socket);

   }

   xPrintf( "\n -> server socket create pass \n");

   vTaskDelay(1000 / portTICK_RATE_MS);

   

   

   

   sprintf(strHostIp, "%d.%d.%d.%d", emacIPADDR0, emacIPADDR1, emacIPADDR2, emacIPADDR3);

   xPrintf( "%d.%d.%d.%d", emacIPADDR0, emacIPADDR1, emacIPADDR2, emacIPADDR3);

   vTaskDelay(1000 / portTICK_RATE_MS);

   

   memset( &server_addr, 0, sizeof( server_addr));

   server_addr.sin_family     = AF_INET;

   server_addr.sin_port       = htons( PortNum);

   server_addr.sin_addr.s_addr = inet_addr(strHostIp);


  

   // bind

   if( -1 == bind( server_socket, (struct sockaddr*)&server_addr, sizeof( server_addr) ) )

   {

      xPrintf( "\n -> bind() starting error \n");

       vTaskDelay(1000 / portTICK_RATE_MS);

      close( server_socket);

   }

  

   xPrintf( "\n -> bind() starting pass \n");

   vTaskDelay(1000 / portTICK_RATE_MS);

   

   

      //listen

      if( -1 == listen(server_socket, 5))

      {

          xPrintf( "\n -> Standby state mod config failed\n");

          vTaskDelay(1000 / portTICK_RATE_MS);

          close( server_socket);

      }

      

      xPrintf( "\n -> Standby state mod config pass\n");

      vTaskDelay(1000 / portTICK_RATE_MS);

      

      

     while(1)

     {

      //accept

      xPrintf( "\n Accepting...\n");

      client_addr_size  = sizeof( client_addr);

      client_socket     = accept( server_socket, (struct sockaddr*)&client_addr, &client_addr_size);

      xPrintf( "\nAccept success.\n");

      if ( -1 == client_socket)

      {

          xPrintf( "\n -> Client connect enable failed \n");

          vTaskDelay(1000 / portTICK_RATE_MS);

          continue;

      }

      

      xPrintf( "\n -> Client connect enable passed \n");

      vTaskDelay(1000 / portTICK_RATE_MS);

      

     while(1)

     {

    

    

       

      //rcv

      chk_rcv= read(client_socket, buff_rcv, BUFF_SIZE);

      if (-1 == chk_rcv)  //read() == recv( flag =0 )

      {

        xPrintf( "\n -> read() failed \n");break;

      } 

      else if(0 == chk_rcv)

      {

        break;

      }

           

      xPrintf( "\n -> receive: %s\n", buff_rcv);

      vTaskDelay(1000 / portTICK_RATE_MS);

      

      

      

     

      //snd

       //chk_snd= write( client_socket, buff_snd, strlen( buff_snd)+1);

      chk_snd= write( client_socket, buff_rcv, strlen( buff_rcv)+1);

      

      if (-1 ==chk_snd)  // +1: NULL까지 포함해서 전송)

      {

         xPrintf( "\n -> write() failed \n");break;

      }        

      

      

      xPrintf("\n -> send: %s\n", buff_rcv);

      vTaskDelay(1000 / portTICK_RATE_MS);

      

      

     }  

     

      //close(client_socket);

      close(client_socket);

     if(close(client_socket)){ break; }


     

     }


      //close(server_socket);

      close(server_socket);



    

}