도와주세요!!
안녕하세요. 임베디드 관련 자료를 찾아보다가 좋은 글이 많아 공부할겸 가입하게 되었습니다.
(에구...처음이라 그런지 글을 잘못 올렸네요... 수정했습니다.)
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);
}
현재 수정해도 반응 없는 목록
lwIPInit 함수의 sys_set_state(( signed char * ) "lwIP", lwipTCP_STACK_SIZE); 중 lwipTCP_STACK_SIZE 스택 값 700->2500,3000
lwIP 폴더의 opt.h의 mem_size 1600 -> 2048,2500
메인 함수의 sys_set_state( ( signed char * ) "LwIpSocket", lwIpTCP_CLIENT_STACK_SIZE); 중 lwIpTCP_CLIENT_STACK_SIZE 350 -> 2500
FreeRTOSConfig .h 의 configTOTAL_HEAP_SIZE 값 52000 -> 210000
STR91x_Flash.icf파일의 define symbol __ICFEDIT_size_heap__ 값 0x800=2048 -> 0x900 = 2304