도와주세요!!
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. 그러고 보니 제 보드와 노트북이 연결이 무선인 것도 있었네요...
하아... recv와 snd 가 각각 대기 잡아서 그런거였네요... 이걸 태스크로 별개의 while 문으로 돌려봐야겠습니다.