Q&A

  • ClientSocket과 ProcessMessages ?
한 함수에서 ClientSocket이 Open, SendText(..), Close을 연속적으로

호출하는 방법 알려 주세요 T.T;



[의문 1]

버튼클릭 이벤트에서 아래처럼 ClientSocket을 Open하고

Application.ProcessMessages;한 후 SendText(..)하니깐 제대로 돌아갑니다.

그러나 OnTimer이벤트에 똑같은 내용을 넣으면 ServerSocket에서

OnClientConnect이벤트만 발생하고 OnClientRead나 OnClientDisconnect는

발생하지 않습니다. Why???

디버깅하면서 한 스텝씩 보면 SendText(...)가 또 제대로 가네요...나참!!!



ClientSocket1.Address := IP_ADDRESS; // IP는 실제 계속 루프 돌면서 계속 바뀜

ClientSocket1.Port := PORT_NUM;

ClientSocket1.Active := True;

Application.ProcessMessages;

ClientSocket1.Socket.SendText('test...');

ClientSocket1.Active := False;



[의문 2]

위의 문장을 루프 속에 넣어서 돌리면 한 번도 SendText(..)가 보내지지 않네요.

디버깅으로 한 스텝씩 따라가 보면 첫 번째 루프만 SendText(..)가 동작합니다.

그 뒤론 계속 Active가 False로 나옵니다.

어떻게 하면 아래에서 의도하는 데로 실행할 수 있을까요????



for i:=0 to 10 do

begin

ClientSocket1.Address := IP_ADDRESS; // IP는 실제 계속 루프 돌면서 계속 바뀜

ClientSocket1.Port := PORT_NUM;

ClientSocket1.Active := True;

Application.ProcessMessages;

ClientSocket1.Socket.SendText('test...');

ClientSocket1.Active := False;

end;



아무래도 큐에 있는 메시지 들이 모두 처리되기 전에 SendText(..)가 실행되는 것같은데...

만약 그렇다면 반드시 순차적으로 실행시키는 방법은 없나요?



무지 급해요!! 꼭 답변 바랍니다.

1  COMMENTS
  • Profile
    구창민 1999.08.03 17:32
    아뿔사 께서 말씀하시기를...

    > 한 함수에서 ClientSocket이 Open, SendText(..), Close을 연속적으로

    > 호출하는 방법 알려 주세요 T.T;

    >

    > [의문 1]

    > 버튼클릭 이벤트에서 아래처럼 ClientSocket을 Open하고

    > Application.ProcessMessages;한 후 SendText(..)하니깐 제대로 돌아갑니다.

    > 그러나 OnTimer이벤트에 똑같은 내용을 넣으면 ServerSocket에서

    > OnClientConnect이벤트만 발생하고 OnClientRead나 OnClientDisconnect는

    > 발생하지 않습니다. Why???

    > 디버깅하면서 한 스텝씩 보면 SendText(...)가 또 제대로 가네요...나참!!!

    >

    > ClientSocket1.Address := IP_ADDRESS; // IP는 실제 계속 루프 돌면서 계속 바뀜

    > ClientSocket1.Port := PORT_NUM;

    > ClientSocket1.Active := True;

    > Application.ProcessMessages;

    > ClientSocket1.Socket.SendText('test...');

    > ClientSocket1.Active := False;

    >



    아뿔사님 안녕하세요?

    위의 문장이 제대로 수행되리라고 보장할수 없을거 같습니다.

    소켓이 연결되면 두 소켓간에 '나 왔다', '너 잘왔다'라는 형태의

    눈에 보이지 않는 데이타를 주고 받습니다.

    서버소켓이 연결되는 과정을 보면 아래처럼..

    OnListen

    OnGetSocket

    OnClientConnect

    OnAccept //데이타를 받을 준비가 됨.

    //...데이타를 주고 받음.

    OnClientWrite

    위의 형태를 보면 알수 있죠.

    즉, Connecting 되고 있을때 데이타를 날리지 않는다는

    보장이 없기 때문입니다.

    그러니 확실히 받았다는 보장도 할수 없는 것이겠지요.

    그러므로, ClientSocket의 OnConnect 이벤트가 발생한뒤

    문자열을 전송하는 것이 안전하다고 말씀드릴수 있습니다.





    > [의문 2]

    > 위의 문장을 루프 속에 넣어서 돌리면 한 번도 SendText(..)가 보내지지 않네요.

    > 디버깅으로 한 스텝씩 따라가 보면 첫 번째 루프만 SendText(..)가 동작합니다.

    > 그 뒤론 계속 Active가 False로 나옵니다.

    > 어떻게 하면 아래에서 의도하는 데로 실행할 수 있을까요????

    >

    > for i:=0 to 10 do

    > begin

    > ClientSocket1.Address := IP_ADDRESS; // IP는 실제 계속 루프 돌면서 계속 바뀜

    > ClientSocket1.Port := PORT_NUM;

    > ClientSocket1.Active := True;

    > Application.ProcessMessages;

    > ClientSocket1.Socket.SendText('test...');

    > ClientSocket1.Active := False;

    > end;

    >

    > 아무래도 큐에 있는 메시지 들이 모두 처리되기 전에 SendText(..)가 실행되는 것같은데...

    > 만약 그렇다면 반드시 순차적으로 실행시키는 방법은 없나요?

    >

    > 무지 급해요!! 꼭 답변 바랍니다.



    한스텝씩 진행하면 전송이 한번 된다고 하셨는데,

    Connecting이 되는 시간이 얼마간이 주어졌기 때문이라 생각됩니다.

    그리고, 한 함수에서 ClientSocket이 Open, SendText(..), Close를

    연속적으로 호출하는 것은 위에서 말씀드렸듯이 안전히

    데이타를 전송한다고 보장할수 없습니다.



    정리해보면,

    먼저 접속이 이루어지고, 즉 ClientSocket의 OnConnect 이벤트 핸들러에서

    데이타를 보내는 문장을 기술하시고, SetverSocket에서 잘 받았다는

    문장을 보내어줘서 데이타가 제대로 왔을때, ClientSocket에서

    그때 소켓을 닫는것이 안전하리라 생각됩니다.



    도움이 되셧나 모르겠습니다.



    그럼.. 즐거운 프로그래밍 되시길~