|
버퍼 안에 아직 데이터가 남아 있는지 없는지는 알기가 매우 힘듭니다.
우선 왜 data1이 버퍼에 있으면 data2를 보내지 말아야 하는지가 궁굼하군요.
일반적으로 소켓통신을 할 경우 데이터들을 structure 화 하여 해당 structure앞에
공통적인 header를 붙여 보냅니다.
받는쪽에서 이 해당 header를 분석하여 데이터를 제 정돈하여 하상합니다.
네트웍이란것은 아무리 같이 보내고 아님 따로 보내고 해도
받는쪽 입장에서는 같은 의미가 있습니다.
가령 가 와 나라는 데이터를 보내 본다고 하죠
가는 이미 나의 버퍼에서 떠났습니다.
그러나 상대방에 도착전입니다. (Internet 교환기의 트래픽으로 인해)
나를 이제 보냅니다.
나가 흘러흘러 가와 같이 도착합니다.
즉 받은쪽에서는 가와 나가 연결되어 받을 확율이 있다는것 이지요.
그러므로 이쪽에서 버퍼에서 나간것이 상대방이 받았다는 절대적인 충분조건이
되지 않습니다.
즉 이러한 문제를 해결하기 위하여 자신의 데이터를 어떠한 규격화된 구조로
만들어 받은 데이터를 쭉 연결하여 분석할 수 있는 능력을 가져야 합니다.
만일 이러한 작업이 힘들고 귀찮다고 생각하시면
Indy 의 component를 사용하세요.
즉 동기 통신을 하라는 것 이지요(Indy 는 동기 소켓통신을 기본으로 합니다)
아시다시피 ServerSocket ,Client Socket은 비동기 방식을 일반적으로 운용합니다/
이를 동기방식으로 운영할려면 많이 힘들것 입니다.
이러한 동기방식을 싶게 처리해 주는것이 Indy입니다.
BCB6.0에는 기본적으로 탑제 된걸로 들었는데요.(5.0 쓰는 관계로)
아시다시피 동기방식은 이쪽에서 1 바이트를 보낼경우 상대방이 1바이트를 받기 전에는
해당 루틴을 빠저 나오지 않습니다.
즉 보내면 특별한 네트웍의 오류가 없는한 받았다는 결론이지요
그러므로 흔히 Thread로 이러한 송수신은 운영을 합니다.
Indy를 참고하세요 (훨씬 통신이 빠릅니다)
안태경 님이 쓰신 글 :
: 네트웍으로 Data를 전송하는 프로그램을 만들고 있습니다.
:
: 두가지 Data를 두개의 소켓으로 각각 보내도록 만들었습니다.
:
: 그런데 이 두 Data에는 우선순위가 있습니다.
:
: Data1이 존재하면 Data2가 아무리 많더라도 무조건 Data1부터 보냅니다.
:
: 그런데 Data1과 Data2를 각각 SendBuf로 보내면
:
: 이 Data들이 실제 전송된 것이 아니라 소켓의 전송버퍼 안에 들어가 있게 됩니다.
:
: 따라서 Data1이 실제로 전송이 되었는지 아니면 전송버퍼안에 남아 있는지를 알 필요가 있습니다.
:
: Data1이 전송버퍼안에 남아 있다면 Data2는 보내지 말고 기다려야 하거든요.
:
: 어떻게 하면 전송버퍼 안에 남아 있는 Data의 양을 알수가 있습니까?
:
: 또는 위의 경우 소켓에 우선순위를 줄수는 없나요?
:
: 제가 사용하는 소켓은 빌더의 기본 소켓인 TServerSocket과 TClientSocket입니다.
:
: 고수님들의 가르침 부탁드립니다.
:
|