|
Indy컴포넌트를 이용하여 서버-클라이언트를 구성하였습니다.
Server1 : Client1의 통신에서는 정상적으로 동작합니다.
그런데 Server1 : Client(n)의 통신시 동작중에 " WSAENOBUFS (10055) No buffer space available. "
에러 메시지가 발생합니다.
메시지를 보면 사용가능한 버퍼 공간이 부족하다는 뜻인데...
1)
Server와 Client의 통신 데이타는 한번에 150바이트가 넘지 않습니다.
그리고 RecvBufferSize, SendBufferSize의 경우 모두 32768입니다.
이 정도면 상당히 큰 사이즈 아닌가요??
버퍼 사이즈를 늘려야 한다면 어떤 함수를 사용해야 하나요?
2)
해당 오류발생시 처리 방법이 궁금합니다.
아래의 서버 예외처리 함수에서 처리하면 되는건가요??
void __fastcall TMainForm::IdTCPServerException(TIdPeerThread *AThread,
Exception *AException)
{
int ErrorCode = ((EIdSocketError *)AException)->LastError;
if(ErrorCode == 10055)
{
// 해당 클라이언트 쓰레드의 송/수신 버퍼를 클리어하고
// 에러코드를 0으로 초기화한다...
}
}
3)
아래 코드는 클라이언트로부터 패킷을 수신 받는 루틴입니다.
각 클라이언트의 통신 쓰레드가 인수로 전달된 AThread로 알고있습니다.
그렇다면 여러개의 클라이언트와 통신할 때 아래의 buf변수는 어떻게 되나요?
buf는 클라이언트에 하나씩 있어야 하는데...
아래와 같이 코딩하면 여러 클라이언트에서 독립적으로 buf변수를 사용하게 되나요?
(클라이언트로부터 데이타 받은 뒤 정상데이타라면 해당 명령에 따라 클라이언트에 데이타를 전송한다.)
void __fastcall TMainForm::IdTCPServerExecute(TIdPeerThread *AThread)
{
unsigned char buf[MAX_PACKET] = {0,};
try
{
AThread->Connection->ReadBuffer(buf, MAX_PACKET);
}catch(...){}
// Check Check Sum
unsigned int CheckSum = buf[0] + buf[1] + buf[2] + buf[3] + buf[4] + buf[5];
if( CheckSum != (unsigned int)((buf[6]<<8) | buf[7]) ) return;
// Make Tx Packet
SendTx();
//----------------------------------------------------------------------//
}
고수님의 조언부탁드립니다.
감사합니다.
|