글 수 83
예전에 하이텔 게제동 네트웍 게시판에 썼던 글입니다.
제 목:[답변] cpio에서 send 관련자료:없음 [2459]
보낸이:유영천 (yuchi ) 2001-01-31 18:11 조회:299
cpio는 단지 스레드 풀과 overlapped io를 묶어주는 수단이라고 생각
하시면 됩니다.일단 send,recv시 어느 소켓 방식에서나 공통적인 특
성은 보낸다고 한번에 다 가는 것이 아니며 받는다고 원하는 만큼
한번에 다 받을 수 있다는게 아니라는 점입니다.
간단하게 구현하는 요령을 적겠습니다.
send상황.
1.WSASend()로 1000바이트 정도 보냈다.
2.네트웍상태가 극히 나쁘지 않다면 적어도 1초안에 GetQueued...()함수
로 블럭되어있던 스레드 하나가 활동할 것이다.Overlapped의 포인터를
얻어 확인해보면 이전에 send에 사용했던 overlapped구조체일것이다.
GetQueued..()함수가 넘겨준 값을 통해 얼마만큼 전송에 성공했는지
알 수 있다.한 500쯤 넘어왔으면 500바이트 전송에 성공한것이다.
나머지 500바이트는??? "반드시!!!! 재전송해야한다." 왜냐하면 방금
요청한 send는 500바이트 전송성공이라는 결과를 내고 종료했기 때문
이다.방금 사용한 overlapped구조체를 재활용하면 된다.모든값을 0으
로 굳이 초기화 할 필요는 없다.하여간 중요한건 전송에 성공한 데이
타를 제외하고는 몽땅 재전송을 해야하므로 기본적으로 send큐가 하나
필요하다.overlapped는 재활용해도 되므로 굳이 다시 할당할 필요는
없다. 소켓 하나당 접속할때 두개씩 할당해주면 끊을때까지 쓸수 있다.
recv용 하나, send용 하나다.
recv상황
1.최초로 접속을 받았으면 컴플리션 포트에 바인딩 한다.(CreateIoCompl
etionPort()사용)
2.이 컨넥션에 대해 WSARecv()를 요청해둔다. 갖고 있는 recv버퍼 사이즈
보다 크게 요청하지 않도록 주의한다.
3.이제 패킷이 도착하면 WSARecv에 인자로 넣어준 버퍼에 패킷이 쌓이게
된다.async나 기타 방식들과는 달리 recv이벤트를 통지받았을땐 이미
버퍼에 패킷이 들어와있는것이다.이때 GetQueued...()함수로 블럭되어
있던 스레드가 활동하기 시작한다.
4.마찬가지로 overlapped포인터를 얻어서 확인해보면 아까 WSARecv할때
넣어준 그 overlapped구조체임을 알 수 있다.
하여간 먼저번에 요청한 WSARecv오퍼레이션은 이것으로 종료한 것이다.
이 컨넥션을 통해 앞으로도 메시지를 더 받아야 하므로 현재 recv버퍼
의 남은 공간만큼 또 WSARecv()를 걸어준다.물론 overlapped구조체는
재활용할 수 있다.정상적이라면 다시 초기화할 필요도 물론 없다.
제 목:[답변] cpio에서 send 관련자료:없음 [2459]
보낸이:유영천 (yuchi ) 2001-01-31 18:11 조회:299
cpio는 단지 스레드 풀과 overlapped io를 묶어주는 수단이라고 생각
하시면 됩니다.일단 send,recv시 어느 소켓 방식에서나 공통적인 특
성은 보낸다고 한번에 다 가는 것이 아니며 받는다고 원하는 만큼
한번에 다 받을 수 있다는게 아니라는 점입니다.
간단하게 구현하는 요령을 적겠습니다.
send상황.
1.WSASend()로 1000바이트 정도 보냈다.
2.네트웍상태가 극히 나쁘지 않다면 적어도 1초안에 GetQueued...()함수
로 블럭되어있던 스레드 하나가 활동할 것이다.Overlapped의 포인터를
얻어 확인해보면 이전에 send에 사용했던 overlapped구조체일것이다.
GetQueued..()함수가 넘겨준 값을 통해 얼마만큼 전송에 성공했는지
알 수 있다.한 500쯤 넘어왔으면 500바이트 전송에 성공한것이다.
나머지 500바이트는??? "반드시!!!! 재전송해야한다." 왜냐하면 방금
요청한 send는 500바이트 전송성공이라는 결과를 내고 종료했기 때문
이다.방금 사용한 overlapped구조체를 재활용하면 된다.모든값을 0으
로 굳이 초기화 할 필요는 없다.하여간 중요한건 전송에 성공한 데이
타를 제외하고는 몽땅 재전송을 해야하므로 기본적으로 send큐가 하나
필요하다.overlapped는 재활용해도 되므로 굳이 다시 할당할 필요는
없다. 소켓 하나당 접속할때 두개씩 할당해주면 끊을때까지 쓸수 있다.
recv용 하나, send용 하나다.
recv상황
1.최초로 접속을 받았으면 컴플리션 포트에 바인딩 한다.(CreateIoCompl
etionPort()사용)
2.이 컨넥션에 대해 WSARecv()를 요청해둔다. 갖고 있는 recv버퍼 사이즈
보다 크게 요청하지 않도록 주의한다.
3.이제 패킷이 도착하면 WSARecv에 인자로 넣어준 버퍼에 패킷이 쌓이게
된다.async나 기타 방식들과는 달리 recv이벤트를 통지받았을땐 이미
버퍼에 패킷이 들어와있는것이다.이때 GetQueued...()함수로 블럭되어
있던 스레드가 활동하기 시작한다.
4.마찬가지로 overlapped포인터를 얻어서 확인해보면 아까 WSARecv할때
넣어준 그 overlapped구조체임을 알 수 있다.
하여간 먼저번에 요청한 WSARecv오퍼레이션은 이것으로 종료한 것이다.
이 컨넥션을 통해 앞으로도 메시지를 더 받아야 하므로 현재 recv버퍼
의 남은 공간만큼 또 WSARecv()를 걸어준다.물론 overlapped구조체는
재활용할 수 있다.정상적이라면 다시 초기화할 필요도 물론 없다.