환경 : Visual Studio 6.0 (간단한 코딩환경을 위해)

와 미치는줄알았다..

Nagle optVal이 -858993664값이 나온다..

↓해답으로 이동↓


일단 Nagle 알고리즘을 간단히 설명하면

(위키 : http://en.wikipedia.org/wiki/Nagle's_algorithm)


send ( "a" );

send ( "b" );

send ( "c" );

send ( "d" );

send ( "e" );


이렇게 전송을하면

1. buffer [ a ,   ]   //a가 버퍼에 쌓임

2. 데이터send중이 아님 => buffer를 send함

3. 보내는동안 buffer에 나머지 데이터가 쌓임

    buffer [ b, c, d, e,  ]

4. buffer가 보내짐



결과를 보면

send ("a");

send ("bcde");

이런식으로 보내지게된다.


왜 문제가 생겼냐면,

받는쪽에서 NULL 문자를 기준으로 출력했을때


a

b
c

d

e


이런 결과값이 출력되어야 하지만



a

bcde


이렇게 출력된다


쒯..

알겠는가? 문제점을?

(Nagle + TCP특성(stream))


어찌어찌하여 Nagle을 찾게되었고

MSDN에서 보니

  int optVal;
  int optLen = sizeof(int);

  if (getsockopt(ListenSocket, 
    SOL_SOCKET, 
    SO_ACCEPTCONN, 
    (char*)&optVal, 
    &optLen) != SOCKET_ERROR) 

    printf("SockOpt Value: %ld\n", optVal); 

예제 코딩이 이런식으로 되어있었다.


뭐가 문제인지.. optVal 값은  Option 값이므로 TRUE, FALSE 가 나와야한다

하지만 미친 -858993664 이런 값이나오니...


인터넷 검색해도 이 코드고, 열혈강의도 이런 코드였다.

뭐가문제냐.... 해서 30분동안 헤메다가



찾아낸 Nagle알고리즘 설정방법은 바로 요것

1. char형으로  처음부터 선언하는것

1
2
3
4
char optVal;
int optLen = sizeof(optVal);

if(getsockopt(mySocketAddr, IPPROTO_TCP, TCP_NODELAY, &optVal, &optLen) == 0)
{

//성공적인 수행

}

2.(char)optVal 로 형변환을 하여 출력

1
2
3
4

int optVal; int optLen = sizeof(optVal); if(getsockopt(mySocketAddr, IPPROTO_TCP, TCP_NODELAY, &optVal, &optLen) == 0)

{

(char)optVal;

}


optVal... 네이년..

char라고 왜 말을못해!!

이렇게 쉬운 실수를 하다니..ㅠㅠ


int인척 둔갑하지마라

'프로그래밍 > Network' 카테고리의 다른 글

error LNK2019: unresolved external symbol __imp__socket@12  (0) 2013.03.11
PF_INET , AF_INET  (0) 2013.03.06
[WINAPI] Local IP 얻어오기  (0) 2013.03.05
by 개발자가 되자! 2013. 3. 8. 03:31
| 1 |