|
아래 소스의 좀 봐주세요. 가끔 프로그램을 먹통으로 만드는 문제가 있습니다.
위치는 SendBuf() 함수 호출 부분이구요. (전체 프로그램 응답없음)
멈추는 상황은... SendBuf()를 한참 하던 중에 커넥션이 끊겼을 경우 입니다.
접속이 유지되는 상태에서는 멈추거나 하는 문제가 없구요......
정지 상태에서 Stop을 시켜서 CPU View로 보면,
WaitForMultipleObjects에 무한 루프가 걸려 있습니다.
(컴파일러 BCB 5, 윈도우 2000에서 테스트 했습니다)
TWinSocketStream에 문제가 있어서 stNonBlocking 으로 바꿨는데도 이 모양이네요 -_-;;
차라리 윈소켓 부분을 내가 직접 만들어서 쓰는 편이 빠르겠다라는 생각까지 들 정도 입니다...
짜증 이빠이 나네요 -_-++++
bool __fastcall TServerThread::Puts( void *pBuffer, int BufSize )
{
int Result, SendSize = 0;
char *pSplit = (char *)pBuffer; // 버퍼를 나누기 위한 임시 변수
SocketTimeOut = P2P_SERVER_SOCKET_TIMEOUT;
BeginTime = GetTickCount();
while( BufSize > SendSize )
{
if( BeginTime+SocketTimeOut <= GetTickCount() ) // 시간 초과?
return false;
if( !IsContinue() ) // 접속 종료나 스레드 종료시 false 리턴
return false;
if( (BufSize-SendSize) >= P2P_PACKET_SIZE )
{
Result = ClientSocket->SendBuf( &pSplit[SendSize], P2P_PACKET_SIZE ); // 멈추는 부분
if( Result > 0 )
SendSize += Result;
}
else
{
Result = ClientSocket->SendBuf( &pSplit[SendSize], BufSize-SendSize ); // 멈추는 부분
if( Result > 0 )
SendSize += Result;
}
Application->ProcessMessages(); // 안돼서 걍 넣어봄 -_-
Sleep(1); // 오버헤드 방지
}
if( SendSize >= BufSize ) // 전송이 성공되었는가?
return true; // Always true
else
return false;
}
|