/*

WSABUF.buf 를 정의를 통해 찾아보면 포인터의 형태로 되어있다고 나와있다.


비동기 수신함수 WSARecv 를 사용하는데 WSABUF를 사용하도록 하고 있다.


WSABUF는 char형과 다르게 구조체이며 안에 추가적으로 len의 길이가 들어가 있다. 


위의 내용을 가지고 의문이 드는 것은 Client 에서 동기송신 함수 send 를 이용해서 데이터를 보낼 때


서버에서는 WSABUF.buf 를 동적할당하고 길이를 늘려서 받는 것도 아니고 WSABUF 자체로 받아버린다.


그리고 읽을 때는 WSABUF.buf 를 읽으면 데이터가 또 잘 읽힌다는 것이다.



혹시 WSABUF.buf가 포인터가 아니고 배열이고 WSABUF 메모리 구조가 buf가 앞쪽에 있어서 데이터를 받을때 


그냥 뒤집어 씌워지기때문에 잘 받아지는 건가 해서 WSABUF 자체를 보내고 서버에서 WSABUF.len이 바뀌는지 보려고


1
2
3
4
5
6
7
    cin >> buf;
        strcpy(wsaBuf.buf,buf);
        wsaBuf.len = sizeof(buf);
        cout << "wsaBuf : " << wsaBuf.buf << "\n";
        cout << "wsaBuf.len : " << wsaBuf.len << "\n";
        send(sock, (char*)&wsaBuf, sizeof(wsaBuf), 0);
 
cs



이렇게 해봤는데 터졌다..  터진걸 보아하니 strcpy의  wsaBuf는 포인터가 분명했다.


WSABuf 는 자체적으로 WSARecv되어 받은 수신버퍼의 메모리를 컴퓨터에 저장하고 WSA.buf 가 그 메모리의 주소를 담는 과정을 하고 있다고 


결론내려봤다. (아닐 수도 있지만 현재는 그렇게 이해했다.)



*/


생각해보니까 WSABUF 는 소켓과 매칭 시켜놓은 버퍼와 연결시켜주는 일밖에 안한다. 그래서 포인터가 맞고 WSABuf가 가르키는 곳에 쌓는다.


신기한 점은 WSABUF.buf 에 저절로 쌓는 다는 것



+ Recent posts