Q&A

  • indy IDTCPServer 컴포넌트 관련하여...
인디를 이용하여 TCP 방식의 소켓 프로그램을 구현하려고 합니다...



현재 9베타 버전을 이용하여 진행중인데...



8에 비해 좀 TCP 도 그렇고 많은 부분이 바뀐 것 같네요...



일단 데모를 TCP관련 찾아보니 2가지의 예가 있고 각각 클라이언트에서



패킷을 쏜후 패킷을 받고 닫는 형태 인것 같습니다(one shot- one receive)



서버에서도 커넥션을 이용하여 커네션을 처리하고 끊은 것 같던데...



이걸 끊는다는 것이 무엇을 뜻하는건지 궁금하네요...



그리고 클라이언트의 요구는 간단하게 한번의 전송단위로 날라 올것 같은데



서버에서는 해당 요구에 여러번에 걸쳐서 내려줘야 할것 같습니다...



여러번이 최대는 몇십번이 되거나 몇백번이 될수 있을 것 같은데...



문제는 클라이언트의 전송속도가 예전의 14400 정도의 속도이다 보니



전송단위도 작게 썰고요



서버에서 어떤 요구에 결과물을 무작위로 내려준다면 과연 클라이언트는



제대로 내려 받을 수 있는지 궁금하네요...



더불어 무작위로 내려보내는 루틴이 클라이언트가 서버에게 요구한 이벤트(쓰레드)



안에서 요구한 클라이언트에게 전송하는 작업이 안에 들어갈 수 밖에 없다보니



서버에 한쓰레드안에서의 작업시간이 길어질것 같은데 이방법이



좋은 방법인지 궁금합니다...



만약 이방법이 가능하다면 클라이언트에게 Send할떼 Sleep 걸어줘야 할까요?



안그러면 무대포로 날라갈텐데 말이지요



관련 프로그램 경험이 계신분 좋은 답변 부탁 드립니다.....



더불어 인디 그리고 인디의 쓰레드와 관련하여 참고할 만한 사항이 된다면



답변 부탁 드리겠습니다...



두서 없이 써내려간 글이었습니다... 끝까지 읽어 주신점 감사드립니다요























































4  COMMENTS
  • Profile
    보고픈 2001.10.30 00:09
    ///''3

    다른 분의 답변이 없는 것 같아 무식하고 게으런 제가...쩝

    제가 잘 못 알고 있을 수도 있으니 참조만 하세요.

    그리고 잘 못 알고 있는 부분은 지적해 주시고요..



    김하늘 wrote:

    > 인디를 이용하여 TCP 방식의 소켓 프로그램을 구현하려고 합니다...

    >

    > 현재 9베타 버전을 이용하여 진행중인데...

    >

    > 8에 비해 좀 TCP 도 그렇고 많은 부분이 바뀐 것 같네요...

    >

    > 일단 데모를 TCP관련 찾아보니 2가지의 예가 있고 각각 클라이언트에서

    >

    > 패킷을 쏜후 패킷을 받고 닫는 형태 인것 같습니다(one shot- one receive)

    >

    > 서버에서도 커넥션을 이용하여 커네션을 처리하고 끊은 것 같던데...

    >

    > 이걸 끊는다는 것이 무엇을 뜻하는건지 궁금하네요...



    ///''3

    인디는 연결이 되면 해당 쓰레드를 자동 생성하는 것 같더군요

    끊는다는 것은 생성되어 사용하던 쓰레드를 파괴한다는 의미인 것 같아요







    > 그리고 클라이언트의 요구는 간단하게 한번의 전송단위로 날라 올것 같은데

    >

    > 서버에서는 해당 요구에 여러번에 걸쳐서 내려줘야 할것 같습니다...

    >

    > 여러번이 최대는 몇십번이 되거나 몇백번이 될수 있을 것 같은데...

    >

    > 문제는 클라이언트의 전송속도가 예전의 14400 정도의 속도이다 보니

    >

    > 전송단위도 작게 썰고요

    >

    > 서버에서 어떤 요구에 결과물을 무작위로 내려준다면 과연 클라이언트는

    >

    > 제대로 내려 받을 수 있는지 궁금하네요...



    ///''3

    제가 알고 있기로는 문제가 없었던걸루 기억합니다.

    (9.0에서는 작업을 하여 보지 못했고요)

    서버에서 클라이언트로 자료를 보낼땐 문제가 없었고요

    클라이언트에서 서버로 자료를 보낼때는 문제가 생기더군요

    일정 이상의 자료(버퍼사이즈)를 보내면 서버에서 자료를 받지 못하는 현상이 생기더군요. 그럴땐 클라이언트를 disconnect시킨후 다시 접속을 시켜서 보내야 하더군요









    >

    > 더불어 무작위로 내려보내는 루틴이 클라이언트가 서버에게 요구한 이벤트(쓰레드)

    >

    > 안에서 요구한 클라이언트에게 전송하는 작업이 안에 들어갈 수 밖에 없다보니

    >

    > 서버에 한쓰레드안에서의 작업시간이 길어질것 같은데 이방법이

    >

    > 좋은 방법인지 궁금합니다...

    >

    > 만약 이방법이 가능하다면 클라이언트에게 Send할떼 Sleep 걸어줘야 할까요?

    > 안그러면 무대포로 날라갈텐데 말이지요



    ///''3

    만약 병목 현상으로 버퍼의 용량을 초과한다면 문제가 생길수도 있겠지요

    그러나 코딩을 서버에서 writeln하구 클라이언트에서 잘 받았다는 메세지를 받도록하면(형식적으로) 아무 문제가 않생기겠죠. readln에 값을 지정하지 않으면 애당초 데이타가 날아 올때까지 무한정 기다리니까여. 아마 그렇게 처리하는것이 바람직할것 같네요



    서버

    writeln(CommandMessage + data);

    stemp:=readln(); <---- 여기서 클라이언트에서 메세지가 날아 올때까지 다음 작업을 하지 않고 기다림



    클라이언트

    stemp:=readln();

    writeln(EchoMessage);









    >

    > 관련 프로그램 경험이 계신분 좋은 답변 부탁 드립니다.....

    >

    > 더불어 인디 그리고 인디의 쓰레드와 관련하여 참고할 만한 사항이 된다면

    >

    > 답변 부탁 드리겠습니다...

    >

    > 두서 없이 써내려간 글이었습니다... 끝까지 읽어 주신점 감사드립니다요

    >





    저두 두서 없이 ...쩝

    그리구 이야기하신 그 예제들이 잘 작성되어 있는것 같더라구요

    하여튼 도움이 되었으면 바라구여. 그리구 새해 복 많이 받으세용



  • Profile
    김하늘 2001.10.30 06:39
    처리는 우선 문자열 단위로 하는 개념보다는

    버퍼 단위 레코드 개념으로 처리를 했습니다...

    예를 들자면 이런겁니다...



    서버이벤트 OnExecute



    클라이언트가 보낸 메시지를 읽는다 ;

    if 특정 패킷 메시지인가 Then Begin

    동적쿼리생성하고

    쿼리 읽고

    while(쿼리 마지막인가) do begin



    쿼리내용을 적재시키고

    버퍼에 적재했으면

    연결된 클라이언트에 send;



    ===> 여기에서 Receive가 가능한가여

    ===> 가능하지 않다면 다른 쓰레드 이벤트가 발동되는게 아닌지여...



    쿼리.next;

    end;

    if 안에서 적재는 했는데 보내지 않을게 있는가 Then Begin

    연결된 클라이언트에 Send;



    ===> 여기에서 Receive가 가능한가여

    ===> 가능하지 않다면 다른 쓰레드 이벤트가 발동되는게 아닌지여...



    end;

    쿼리 닫고

    쿼리 깨끗이 한다...(free)

    end;



    해당 반복 루프 안에서 받을 수 없다면 현재와 별반 차이가 없어서 그래요...

    Receive 체크를 하지 않고 약간의 Sleep 타임만 주었거든요...



    변함없이 읽어 주셔서 감사드립니다요...





  • Profile
    보고픈 2001.10.31 07:56
    김하늘 wrote:

    > 처리는 우선 문자열 단위로 하는 개념보다는

    > 버퍼 단위 레코드 개념으로 처리를 했습니다...

    > 예를 들자면 이런겁니다...

    >

    > 서버이벤트 OnExecute

    >

    > 클라이언트가 보낸 메시지를 읽는다 ;

    > if 특정 패킷 메시지인가 Then Begin

    > 동적쿼리생성하고

    > 쿼리 읽고

    > while(쿼리 마지막인가) do begin

    >

    > 쿼리내용을 적재시키고

    > 버퍼에 적재했으면

    > 연결된 클라이언트에 send;

    >

    > ===> 여기에서 Receive가 가능한가여



    여전히 여기에서 리드문을 사용하시고 클라이언트에서 라이트문을 쓰면 되겠지요.





    > ===> 가능하지 않다면 다른 쓰레드 이벤트가 발동되는게 아닌지여...

    >



    쓰레드가 생성되는 것은 그 객체에대한 연결부분의 쓰레드이지 전송에의 명령어에 대한 쓰레드가 아닌걸루 압니다. 만약 Excute event안에서 disconnect명령어를 사용하지 않아야 하겠지요. 사용할 경우는 모든 작업이 종료 되었을때 일것이고요



    > 쿼리.next;

    > end;

    > if 안에서 적재는 했는데 보내지 않을게 있는가 Then Begin

    > 연결된 클라이언트에 Send;

    >

    > ===> 여기에서 Receive가 가능한가여

    > ===> 가능하지 않다면 다른 쓰레드 이벤트가 발동되는게 아닌지여...

    >

    > end;

    > 쿼리 닫고

    > 쿼리 깨끗이 한다...(free)

    > end;

    >

    > 해당 반복 루프 안에서 받을 수 없다면 현재와 별반 차이가 없어서 그래요...

    > Receive 체크를 하지 않고 약간의 Sleep 타임만 주었거든요...

    >

    > 변함없이 읽어 주셔서 감사드립니다요...

    >

    >



    제가 알기로는 문제가 없는것 같은데 뭔가의 약간의 코딩 실수가 있을지 모르겠군요

    정확히는 알수 없어나 하시고자 하는 일에는 별 문제가 없을 듯합니다.

    그리고 쿼리 전송의 예제는 아니지만 문 구조상 인디 데모 예제 중

    imageserver, imageclient filestream 전송의 예제가 도움이 될듯하네여

    그리고 onexcute event는 그 자체가 루프문의 성격을 가진다는거예여

    connection 이후에는 disconnect의 이벤트가 나타나기 전까지 계속적 반복을 한다는거예여(아시고 계시는 내용이겠지만여) 그것을 정확히 이해를 하신다면 코딩의 단순화가 쉬워 질것이고여 ...

    역시 두서 없이 적어서 도리어 해가 깔리게 했는지 모르겠네여

    하여튼 새해복 많이 받으세요

    꾸벅







  • Profile
    김하늘 2001.10.31 17:58
    while문안에서의 보내고 받음이 처리가 된다면 말씀하신 act(클라이언트로)로 부터의



    답을 받았다는 처리가 가능할것이고 다음으로의 진행 처리가 되겠네요.



    그럼 즐프하십시요.