TCP/IP 소켓 프로그래밍을 보고 서버를 만들어 보고 있는데요. 


서버를 만들기 위해 만든 쓰레드와 태스크에서 만든 Q에 데이터를 넘겨서 Queue가 쌓일때마다


TCP/IP 서버를 통해 전송하려고 합니다. 


그런데 몇가지 문제가 생겨서 이렇게 질문 드립니다.


1.Q를 받을 때마다 보내려면 어떻게 하는게 좋을까요?

지금 아래 소스를 사용하면 클라이언트에서 메세지가 오던가 아니면 처음 시작(accept 성공) 할 때

그간 쌓인 Q가 전송되네요.


2.Q가 일정량 누적 된 상황에서 전송을 시도하면 문제가 생깁니다.

엄청난 딜레이 후에 메세지가 폭주 기관차 마냥 전송되거나 아니면 중간에 클라이언트와 연결이  뚝하고 끊어지네요.


xQR  10 02 E1 00 00 00 00 00 ...

xQR  10 02 E2 00 00 00 00 00 ...

xQR  10 02 E3 00 00 00 00 00 ...

...

...

...

...

 


서버 소스는 대략 아래와 같습니다.



void TCPServer( void  )

{  

    unsigned char  Flag=0;  

    unsigned char  strHostIp[20]; 

    unsigned char  c;

     

    int server_socket;

    int client_socket;

    int client_addr_size;

    int clntData, clntRecvLen; //,clntFromLen;

    int m_Size=0;


    struct sockaddr_in   server_addr;

    struct sockaddr_in   client_addr;


portCHAR  cData[COMM_MESSAGE_SIZE];

portCHAR  Queue[COMM_MESSAGE_SIZE]; 

uint8_t recvBuff[32];


    //create socket

    server_socket  = socket( PF_INET, SOCK_STREAM, 0);

    if( -1 == server_socket)

    {

        xPrintf( "server socket create failed \r\n");

          close( server_socket);

    }

    xPrintf( "server socket create pass \r\n");

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

    xPrintf( "ccu] %d.%d.%d.%d \r\n", emacIPADDR0, emacIPADDR1, emacIPADDR2, emacIPADDR3);

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

    server_addr.sin_family     = AF_INET;

    server_addr.sin_port       = htons( PortNum2);

    server_addr.sin_addr.s_addr = inet_addr(strHostIp);

    // bind

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

    {

        xPrintf( "bind() starting error \r\n");

        vTaskDelay(10 / portTICK_RATE_MS);

        close( server_socket);

    }

    xPrintf( " starting pass \r\n");

    //listen

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

    {

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

        close( server_socket);

    }

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

      while(1)

    {

        xPrintf( "accept\r\n");        

        //accept

        client_addr_size  = sizeof( client_addr);

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

        if ( -1 == client_socket)

        {

            xPrintf( "Client connect enable failed \r\n");

            continue;

        }

        xPrintf( "Client connect enable passed \r\n");

        //for(j=0; j>1024;j++) Queue[j]=0;   

        while(1)

        {              

            Qchk();                        

           

    //rcv

            clntRecvLen = sizeof(cData);

            //clntFromLen = sizeof(client_addr_size);

            clntData = read(client_socket, cData , clntRecvLen);

            if(clntData>0)

            {

                xPrintf(" recv-size : %d \r\n", clntData);           

                ...

(중략)

...    

            }//read data ok

if(client_socket <0 ) break;

        }//rcv & sndwhile

        close(client_socket);

    }//accept 

    close(server_socket);

    i

 //   vTaskDelete( NULL );

}    


void Qchk(void)

{              

    while(uxQueueMessagesWaiting( qEvent ) ) //while(xQueueReceive( qEvent,&tstmsg,0))

    {

        xQueueReceive( qEvent,&tstmsg,0);

        xPrintf(" xQR");

        for(int x =0; x< copysize ;x++)

        {

            xPrintf("  %02x" ,tstmsg[x]);

        }        

        xPrintf(" \r\n");

    }

}


제가 작성한 프로그램에서 제가 잘못 이해한 부분과 수정해야 할 부분을 지적해 주시면 감사하겠습니다.

p.s. 그러고 보니 제 보드와 노트북이 연결이 무선인 것도 있었네요...