Form1->serverSend(data);
위와 같은 코드가 문제가 될 가능성이 클것같은데요...
Indy의 TIdTCPClient의 Execute이벤트는 쓰레드내에서 돌기 때문에 메인쓰레드의 자원은 안건드는것이 좋죠...
박지민 님이 쓰신 글 :
: 클라이언트 사용부분에 문제가있나요? 클라이언트 문제인지 서버문제인지;
:
: 먹통이되는 문제가 발생하는데 원인을 못찾겠네요ㅠ 클라이언트는 디스커넥트 이벤트도 발생을 안하고
:
: 타임아웃같은것도 사용안함으로 잘되있는거같은데...
:
: 많은 패킷이 중계되는 서버와 클라이언트 입니다.
:
: 조언좀 부탁드립니다ㅠ
:
: 클라이언트 설정은
: ReuseSocket = rsFalse
: UseNagle = False
: TerminateWaitTime = 0
:
: 서버 설정은
: ConnectTimeout = 0
: IPVersion = Id_IPv4
: Port = 0
: ReadTimeout = -1
: ReuseSocket = rsFalse
: UseNagle = False
:
:
:
: //클라이언트 쓰레드 Execute 처리부분
: void __fastcall tcpClient::Execute()
: {
: while(Form1->IdTCPClient1->IOHandler->Connected()){
: try{
: int RecieveSize = Form1->IdTCPClient1->IOHandler->InputBuffer->Size;
:
: if(RecieveSize > 0){
: TIdBytes data;
: Form1->IdTCPClient1->IOHandler->ReadBytes(data, RecieveSize, false);
: Form1->serverSend(data);
: }else{
: Sleep(20);
: }
: }catch(...){
: Form1->clientClose();
: }
: }
: Form1->clientClose();
: //---- Place thread code here ----
: }
:
: //서버 Execute 이벤트 처리부분
: try{
:
: if(AContext->Connection->IOHandler->Connected()){
: int RecieveSize = AContext->Connection->IOHandler->InputBuffer->Size;
:
: if(RecieveSize > 0){
: TIdBytes array;
: AContext->Connection->IOHandler->ReadBytes(array, RecieveSize, false);
:
: for(int i = PacketIdx; i < RecieveSize; i++){
: PacketD[i] = array[i];
: }
: PacketIdx += RecieveSize;
: while (true) {
: int length = PacketD[0] & 0xFF;
: length |= PacketD[1] << 8 & 0xFF00;
: if ((length == 0) || (length > PacketIdx)) break;
:
: TIdBytes temp;
: temp.set_length(length);
:
: for(int i = 0; i < length; i++){
: temp[i] = PacketD[i];
: }
: PacketIdx -= length;
: for(int i = 0; i < PacketIdx; i++){
: PacketD[i] = PacketD[(length + i)];
: }
:
: clientSend(temp);
:
: }
: }else{
: Sleep(20);
: }
: }else{
: Sleep(20);
: }
:
:
: }catch(...){
: }
:
: |