Q&A

  • Socket전송에서 보낼 Packet의 분리
안녕하십니까?

여러개의 데이터를 SendText 명령을 사용하여 연속적으로 보낼 경우 이 데이터가

각각의 Packet으로 전송되지 않고 합쳐지는 문제가 있습니다.

즉 다음 예와 같이 전송했을 경우 수신측에는 하나의 Packet 즉 뭉쳐서 쭉 나오는데,

이와 관련하여 같은 질문이 131번에 있으며, 그에 대한 방법이 나와 있는데,

전송할 데이터에 #13#10 추가는 단지 Display문제만 해결할 뿐 실제 TCP/IP Packet을

나누어서 전송하지는 못합니다.





예) for 1 := 1 to 10 do

ClientSocket.Socket.SendText('AAA');





일차적으로 위 SendText다음에 일정시간 Delay를 주면 Packet이 분리되어 해결이 되지

만, 좋은 방법이 아니기 때문에 정확한 방법이나 자료를 찾습니다.

잘 아시는분 부탁 합니다.







3  COMMENTS
  • Profile
    구창민 2000.01.14 20:14
    신화 wrote:

    > 안녕하십니까?

    > 여러개의 데이터를 SendText 명령을 사용하여 연속적으로 보낼 경우 이 데이터가

    > 각각의 Packet으로 전송되지 않고 합쳐지는 문제가 있습니다.

    > 즉 다음 예와 같이 전송했을 경우 수신측에는 하나의 Packet 즉 뭉쳐서 쭉 나오는데,

    > 이와 관련하여 같은 질문이 131번에 있으며, 그에 대한 방법이 나와 있는데,

    > 전송할 데이터에 #13#10 추가는 단지 Display문제만 해결할 뿐 실제 TCP/IP Packet을

    > 나누어서 전송하지는 못합니다.

    >

    >

    > 예) for 1 := 1 to 10 do

    > ClientSocket.Socket.SendText('AAA');

    >

    >

    > 일차적으로 위 SendText다음에 일정시간 Delay를 주면 Packet이 분리되어 해결이 되지

    > 만, 좋은 방법이 아니기 때문에 정확한 방법이나 자료를 찾습니다.

    > 잘 아시는분 부탁 합니다.

    >

    >

    >



    이런 질문을 많이 보았습니다만,

    패킷을 전송할때, 루프에 넣는 방법은

    안전한 전송을 보장하지 못합니다.



    델파이의 소켓으로 non-blocking 모드를 사용하신다면,

    한 패킷을 던지면 그에 상응하는 응답패킷을 받고

    확인을 거친후 다음 패킷을 던지는 형태로

    작업을 전환하시길 권해봅니다.



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

  • Profile
    신화 2000.01.15 20:16
    구창민 wrote:

    > 신화 wrote:

    > > 안녕하십니까?

    > > 여러개의 데이터를 SendText 명령을 사용하여 연속적으로 보낼 경우 이 데이터가

    > > 각각의 Packet으로 전송되지 않고 합쳐지는 문제가 있습니다.

    > > 즉 다음 예와 같이 전송했을 경우 수신측에는 하나의 Packet 즉 뭉쳐서 쭉 나오는데,

    > > 이와 관련하여 같은 질문이 131번에 있으며, 그에 대한 방법이 나와 있는데,

    > > 전송할 데이터에 #13#10 추가는 단지 Display문제만 해결할 뿐 실제 TCP/IP Packet을

    > > 나누어서 전송하지는 못합니다.

    > >

    > >

    > > 예) for 1 := 1 to 10 do

    > > ClientSocket.Socket.SendText('AAA');

    > >

    > >

    > > 일차적으로 위 SendText다음에 일정시간 Delay를 주면 Packet이 분리되어 해결이 되지

    > > 만, 좋은 방법이 아니기 때문에 정확한 방법이나 자료를 찾습니다.

    > > 잘 아시는분 부탁 합니다.

    > >

    > >

    > >

    >

    > 이런 질문을 많이 보았습니다만,

    > 패킷을 전송할때, 루프에 넣는 방법은

    > 안전한 전송을 보장하지 못합니다.

    >

    > 델파이의 소켓으로 non-blocking 모드를 사용하신다면,

    > 한 패킷을 던지면 그에 상응하는 응답패킷을 받고

    > 확인을 거친후 다음 패킷을 던지는 형태로

    > 작업을 전환하시길 권해봅니다.

    >

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





    답변 감사합니다.



    위의 예에서 for loop를 쓴것은 단지 연속된 SendText의 사용을 보여주기 위한 것이며,

    또한 loop 사용이 잘못된 방법이거나 전송자체에 문제를 주지는 않습니다.

    또한 서로간에 확인패킷을 주고받는것도 가능합니다만, 그렇지 않고도 가능하며, 실제로

    대규모 N/W에서 사용합니다.

    이것은 C++을 사용했을 경우인데, C++로 위와 같은 방법을 사용하게 되면, 앞서 제가

    질문한 Packet이 분리가 됩니다.



    질문을 다르게 말하면, C++에서는 연속해서 송신 명령을 주어도 Packet이 분리가 되는데, 델파이에서는 분리가 안되므로, 이것을 해결하고자 합니다.

    저는 C++프로그래밍이 안되므로 바로 그것이 문제인것입니다.



    여러분의 좋은 의견 기다리겠습니다. 감사합니다.

  • Profile
    구창민 2000.01.20 11:03
    신화 wrote:

    > 구창민 wrote:

    > > 신화 wrote:

    > > > 안녕하십니까?

    > > > 여러개의 데이터를 SendText 명령을 사용하여 연속적으로 보낼 경우 이 데이터가

    > > > 각각의 Packet으로 전송되지 않고 합쳐지는 문제가 있습니다.

    > > > 즉 다음 예와 같이 전송했을 경우 수신측에는 하나의 Packet 즉 뭉쳐서 쭉 나오는데,

    > > > 이와 관련하여 같은 질문이 131번에 있으며, 그에 대한 방법이 나와 있는데,

    > > > 전송할 데이터에 #13#10 추가는 단지 Display문제만 해결할 뿐 실제 TCP/IP Packet을

    > > > 나누어서 전송하지는 못합니다.

    > > >

    > > >

    > > > 예) for 1 := 1 to 10 do

    > > > ClientSocket.Socket.SendText('AAA');

    > > >

    > > >

    > > > 일차적으로 위 SendText다음에 일정시간 Delay를 주면 Packet이 분리되어 해결이 되지

    > > > 만, 좋은 방법이 아니기 때문에 정확한 방법이나 자료를 찾습니다.

    > > > 잘 아시는분 부탁 합니다.

    > > >

    > > >

    > > >

    > >

    > > 이런 질문을 많이 보았습니다만,

    > > 패킷을 전송할때, 루프에 넣는 방법은

    > > 안전한 전송을 보장하지 못합니다.

    > >

    > > 델파이의 소켓으로 non-blocking 모드를 사용하신다면,

    > > 한 패킷을 던지면 그에 상응하는 응답패킷을 받고

    > > 확인을 거친후 다음 패킷을 던지는 형태로

    > > 작업을 전환하시길 권해봅니다.

    > >

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

    >

    >

    > 답변 감사합니다.

    >

    > 위의 예에서 for loop를 쓴것은 단지 연속된 SendText의 사용을 보여주기 위한 것이며,

    > 또한 loop 사용이 잘못된 방법이거나 전송자체에 문제를 주지는 않습니다.

    > 또한 서로간에 확인패킷을 주고받는것도 가능합니다만, 그렇지 않고도 가능하며, 실제로

    > 대규모 N/W에서 사용합니다.

    > 이것은 C++을 사용했을 경우인데, C++로 위와 같은 방법을 사용하게 되면, 앞서 제가

    > 질문한 Packet이 분리가 됩니다.

    >

    > 질문을 다르게 말하면, C++에서는 연속해서 송신 명령을 주어도 Packet이 분리가 되는데, 델파이에서는 분리가 안되므로, 이것을 해결하고자 합니다.

    > 저는 C++프로그래밍이 안되므로 바로 그것이 문제인것입니다.

    >

    > 여러분의 좋은 의견 기다리겠습니다. 감사합니다.





    안녕하세요~ 구창민입니다.



    너무 늦게 글을 읽고 답변드리는거 같아 죄송스럽습니다.



    말씀하신 루프내에 패킷을 전송하는 문장을 넣은 C++프로그래밍을

    어떻게 하신다는 건지 몰라도, 저는 가장 안전한 방법을 말씀드린 겁니다.



    구지 그렇게 하길 원하신 다면 TClientSocket과 TServerSocket을

    사용하신다면 그 방법이 없다고 감히 말씀드립니다.

    물론 Delay를 주기를 원치 않으신 다는 가정하에서요 ^^



    그리고, 실제 대규모 N/W에서도 사용하신다고 하셨는데,

    그것은 패킷을 송수신시 패킷당 CRC체크나 기타

    수신체크용 루틴이 들어있지 않다는 말씀으로 들리는 군요.

    그것이 안전한 프로그램일까요?

    받은 패킷을 크기만큼 정확히 전송되었는지 확인을 거친 후

    그에 상응한 응답과 응답을 받았을때만 다음 패킷을

    던지는 것이 가장 안전한 방법과 최선책이 아닐까요?



    그리고, 꼭 그런 루프내에서 던지는 방안을 사용하고 싶으시다면,

    NM컴포넌트에서 찾아서 이용해 보세요.

    Stream을 전송할수 있는 메소드가 있습니다.



    혹은 윈쇼우나, 아이시에스 컴포넌트도 추천드립니다. ^^

    아마 맘에 쏙 드실거 같네요.



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