Q&A

  • 소켓버퍼 초기화?


Socket.SendBuf를 이용해서 데이터를 보내는데 중간에 버퍼가 초과해서

데이터가 가질 않습니다. 어떻게 해결해야하는지...



소켓버퍼를 초기화하면 될런지? 소켓버퍼를 초기화 하는방법은 무엇인지 알고싶습니다.

아님 다른 방법이라도 알려주세요.



고수님들의 답변을 기다리며....

4  COMMENTS
  • Profile
    이대선 2000.08.18 20:13
    델초 wrote:

    >

    > Socket.SendBuf를 이용해서 데이터를 보내는데 중간에 버퍼가 초과해서

    > 데이터가 가질 않습니다. 어떻게 해결해야하는지...

    >

    > 소켓버퍼를 초기화하면 될런지? 소켓버퍼를 초기화 하는방법은 무엇인지 알고싶습니다.

    > 아님 다른 방법이라도 알려주세요.

    >

    > 고수님들의 답변을 기다리며....



    SendBuf로는 많은 데이타량이 한번에 가지 않습니다.



    가장 좋은방법은 1024Byte 단위로 잘라서 차례차례 보내는 게 좋을 듯 합니다.



    물론 이때로 Client와 Server간에 핸드셰이킹을 해야 겠죠....



    핸드셰이킹이란 간단히 말하면...



    너데이타 줬냐 그래 나 받았다 다므것 줘라 하는 것이죠...



    그럼 이만..

  • Profile
    델초 2000.08.18 20:58
    답변 감사드립니다.



    제경우는 약간 다른것 같거든요(제가 질문을 잘못했나봅니다.)

    Socket.SendBuf를 사용하긴 하지만 데이타를 한번에 많이 보내는건 아니구요 여러개의 데이터를 보내고 있죠. 근데 그중에 몇개를 보내지 못하거든요. 물론 한개한개 보낼때는 잘 가구요.



    예를 들자면 a[1],a[2],a[3],a[4],a[5],a[6],a[7] 이라는 데이터를 보낼때 한 개씩보내면 잘 가는데 for문을 이용해서 보내면 데이터 몇개가 빠진다는거죠.(버퍼가 초과해서리...)



    이건 어떻게 해결해야되나여~ 갈켜주세용~





    이대선 wrote:

    > 델초 wrote:

    > >

    > > Socket.SendBuf를 이용해서 데이터를 보내는데 중간에 버퍼가 초과해서

    > > 데이터가 가질 않습니다. 어떻게 해결해야하는지...

    > >

    > > 소켓버퍼를 초기화하면 될런지? 소켓버퍼를 초기화 하는방법은 무엇인지 알고싶습니다.

    > > 아님 다른 방법이라도 알려주세요.

    > >

    > > 고수님들의 답변을 기다리며....

    >

    > SendBuf로는 많은 데이타량이 한번에 가지 않습니다.

    >

    > 가장 좋은방법은 1024Byte 단위로 잘라서 차례차례 보내는 게 좋을 듯 합니다.

    >

    > 물론 이때로 Client와 Server간에 핸드셰이킹을 해야 겠죠....

    >

    > 핸드셰이킹이란 간단히 말하면...

    >

    > 너데이타 줬냐 그래 나 받았다 다므것 줘라 하는 것이죠...

    >

    > 그럼 이만..

  • Profile
    박서규 2000.08.19 04:07
    보내는 측에서 일방적을 보내면 당연히 죽습니다...

    방법은 이대선님의 의견대로 수신했냐라는 신호를 받아야하구요..

    그런데 이렇게 하다보면 TCP의 특성상 속도저하현상이 일어납니다.

    그래서 이런방법도 있지않을까 해서요..

    보내실때 For문안에 Sleep문으로 약간의 시간지연을 시켜보세요..

    그런데 이의 경우는 UDP상의 RTP구현시에 이용하는건데요..

    수신패킷의 앞부분에 time stamp와 sequantial no등...을 적어서 같이

    보내면 받는측에서는 reconstruct를 하게됩니다.

    그래서 팻킷의 손실이 발생되면 해당패킷의 재전송과 속도를 낮춰달라는

    신호(마치 RTCP같군요...)를 보내주면 보내는 측에서는 속도를 낮추는거죠..

    그런데 제가 해보니 쓰레드를 썼을때, 더 효과적인 프로그램이 되더군요..

    하지만 TCP를 쓰는경우 패킷의 손상이 아닌 버퍼의 넘침문제가 발생되므로

    이 방법은 옳지 않을수도 있습니다.

    하지만 이런방법을 쓰는경우 TCP 보다도 2배의 속도가 되더군요..

    물론 전송제어를 정확히 해야겠죠..

  • Profile
    이대선 2000.08.18 21:17
    델초 wrote:

    > 답변 감사드립니다.

    >

    > 제경우는 약간 다른것 같거든요(제가 질문을 잘못했나봅니다.)

    > Socket.SendBuf를 사용하긴 하지만 데이타를 한번에 많이 보내는건 아니구요 여러개의 데이터를 보내고 있죠. 근데 그중에 몇개를 보내지 못하거든요. 물론 한개한개 보낼때는 잘 가구요.

    >

    > 예를 들자면 a[1],a[2],a[3],a[4],a[5],a[6],a[7] 이라는 데이터를 보낼때 한 개씩보내면 잘 가는데 for문을 이용해서 보내면 데이터 몇개가 빠진다는거죠.(버퍼가 초과해서리...)

    >

    > 이건 어떻게 해결해야되나여~ 갈켜주세용~



    for문을 사용한다는 것은 한번에 많이 보내는 것과 동일하다고 생각 되네요..



    for 루프를 돌리지 말고 핸드셰이킹이 필요할 듯 하네요..



    1. 먼저 a[1]을 주고 a[1]을 받았다면 다시 다음것을 달라는 특수코드를 만들던가 해서 응답을 다시주면...



    2. a[2]를 주어야 겠죠.. 이렇게 이루어 져야만 data를 잊어 버리지 않겠죠...



    저는 data의 신뢰도를 높이기 위해 저는 다음과 같이 사용 합니다.

    ----------------------------------------------------------------

    시작코드 #02 | data의 순서 | 실제data | 끝코드 #03 | 첵섬 |

    ----------------------------------------------------------------

    받았다면 응답의 코드

    -----------------------------------------

    시작코드 #02 | data의 순서 | #03 | 첵섬 |

    -----------------------------------------



    첵섬을 넣어도 되고 않넣어도 된다고 생각 합니다.



    첵섬을 #02 부터 #03 까지 더한값을 말하죠...



    혹시나 깨진 중간에 data가 있을 경우에 첵섬을 사용합니다.



    그리고 물론 첵섬이 #02 나 #03 이 나올 때도 있습니다.



    이때는 비트반전을 시켜야 겠죠...



    물론 data를 주고 몇초가 지난 다음 응답이 없다면 다시 보내야 겠죠...



    응용해서 사용해 보세요...



    그럼 좋은 코딩하세요..