수안이의 컴퓨터 연구실

  • Mainpage
  • About Me
  • Tags
  • Metapage
  • Notice
  • Location
  • Keywords
  • Guestbook
  • Admin
  • Write an Article
  • Total | 1621035
  • Today | 415
  • Yesterday | 482

1 Articles, Search for 'Receive'

  1. 2007/03/02 Socket에서 완벽한 Receive처리
Programming/Network Programming2007/03/02 12:28

Socket에서 완벽한 Receive처리

원본 : http://www.debuglab.com/knowledge/socketreceive.html

1.요약

CSocket에서 Receive하는 몇가지 방법을 알아 본다.


2.본문

int CXXXSocket::Receive(LPVOID lpBuf, int nBufLen, int nFlags) 

{ 

    int nRead; 

    int nLeft = nBufLen; 

    PBYTE pBuf = (PBYTE)lpBuf; 

    

    while(nLeft > 0) 

    { 

        nRead = CSocket::Receive(pBuf, nLeft); 

        if (nRead == SOCKET_ERROR) 

        { 

            return nRead; 

        } 

        else 

            if (nRead == 0) 

            { 

                return nBufLen - nLeft; 

            } 

            

            nLeft -= nRead; 

            pBuf += nRead; 

    } 

    

    return nBufLen - nLeft; 

} 

위의 방법은 winsock1.0사용시 가장 확실하게 Receive버퍼를 비우는 방법입니다. 버퍼에 남아있는 내용이 없을때까지 while문을 돌면서 Receive를 하기 때문이죠. 하지만 보내준 Packet을 한번 받지 못하는 문제를 해결하는 다른 방법도 있죠.

① 버퍼에 남아있는 양을 미리 알아내고 그 양만큼 한번에 받는 방법.
② Receive한 직후 버퍼에 데이터가 남아있는지 검사하여 받는 방법.
①의 방법을 사용한다면 Receive해보는 것보다 부하나 속도면에서 효율 있겠죠. Receive 버퍼에 남아있는 데이터의 양을 알아내는 함수는 ioctlsocket을 이용합니다. CSocket에서는 CAsyncSocket::IOCtl()이죠.

CSocket style : IOCtl(FIOREAD, &dwReadSupposed); 

BSD style : ioctlsocket(sock, FIOREAD, &dwReadSupposed); 

만일 Send 버퍼에 남아있는 데이터의 크기를 알고 싶다면 FIOREAD대신에 FIOWRITE를 쓰면 되겠죠.

ioctlsocket를 이용해 받을 양을 미리 예측하고 그만큼 받으면 한번에 받을수 있을겁니다.

②의 방법은 GetLastError()를 이용하여 소켓이 WOULDBLOCK상태인지 확인하는 것입니다. 소켓 수신계층에서 WOULDBLOCK이란 더이상 읽어들일 데이터가 없는 상태를 의미합니다.

if( GetLastError() != WOULDBLOCK) 

	// 더 받는다. 

정리를 하자면 ①의 과정을 거쳐서 받을 데이터의 양을 미리 예상하여 한번에 받기 작업을 하고 ②과정을 거쳐 확인 사살(?)을 한다면 가장 확실한 방법이 되겠죠.


3.예제

① IOCtl(FIOREAD, &dwReadSupposed);
② Receive(Buffer, dwReadSupposed, 0);
③ if( GetLastError() != WOULDBLOCK)
// 더 받기 ※ 소켓 수신계층에 남아있는 데이터를 어떤방법을 쓰던간에 한번에 읽는게 좋습니다. 왜냐하면 TCP의 경우 송신측과 수신측이 밀접하게 연관 되어 있어서 받는 쪽에서 Receive를 빨리 해주면 해줄수록 전송속도가 올라가기 때문입니다. 만일 Receive를 빨리 해주지 못하면 송식측은 WOULDBLOCK상태에 빠지는데 이는 더이상 데이터를 보낼 수 없음을 의미합니다.

4.참고

마이크로소프트웨어, 데크니컬 컬럼.



- 2001.08.13 Smile Seo -

"Network Programming" 카테고리의 다른 글
  • libpcap을 이용한 포트스캐닝 검사 (2)2007/05/11
  • 네트워크관련 정보 얻기 (0)2007/05/11
  • Socket에서 완벽한 Receive처리 (0)2007/03/02
  • 네트워크 프로그래밍의 원리 이해 - 5 (0)2005/05/29
  • 네트워크 프로그래밍의 원리 이해 - 4 (0)2005/05/29
2007/03/02 12:28 2007/03/02 12:28
Posted by webdizen
Tags Receive, Socket
No Trackback No Comment

Trackback URL : http://www.webdizen.net/blog/trackback/2670

Leave your greetings.

[로그인][오픈아이디란?]

«Prev  1  Next»

RSS HanRSS
Blog Image
webdizen
이 곳은 컴퓨터에 대해 연구하고, 공유하고, 소통하기 위한 연구실입니다. 개인적으로는 OLAP, Data Mining, Semantic Web, Data Modeling에 대해서 연구하고 있습니다.

Categories

전체 (2998)
Webdizen (134)
Life (6)
Diary (16)
Blog (9)
IDEA (1)
Travel (10)
Book (14)
Photo (7)
Movie (7)
Music (13)
Leisure Sports (10)
Funny (5)
Hardware (119)
Software (120)
Windows (5)
Unix & Linux (119)
Installation (4)
Kernel (10)
System (34)
Develop (22)
X-Window (0)
Applicaton (31)
Security (4)
Framework (2)
Hadoop (2)
Programming (805)
Algorithm & Data Structure (1)
Assembly (38)
UNIX/Linux C (95)
C++ (128)
STL (4)
Java (38)
Win32 API (92)
ATL/COM (44)
MFC (151)
.NET (26)
WCF/WPF (4)
C# (28)
Network Programming (17)
Database Programming (12)
OpenGL / DirectX (13)
Multimedia Programming (0)
Game Programming (21)
Parallel Distributed Progra... (0)
Reverse Engineering (0)
Debugging (9)
Python (1)
Ruby (1)
Ruby on Rails (1)
QT (4)
GTK (0)
JSP (0)
PHP (6)
ASP.NET (6)
ASP (3)
Development (28)
Useful Library (2)
Data Modeling (0)
Database (105)
Oracle (4)
MSSQL (41)
MySQL (2)
Data Warehouse (2)
Data Mining (3)
Network (66)
Web (78)
DHTML (4)
XHTML (1)
Javascript (1)
CSS (1)
AJAX (9)
XML (11)
Flex (1)
Silverlight (3)
Security (91)
DoS (1)
Kernel (10)
Scanning (3)
Sniffing (0)
Spoofing (4)
Overflow (28)
Web (11)
Shell (10)
Format String (14)
Window (2)
Embedded (70)
Multimedia (27)
Mobile (14)
Graphic (24)
Management (633)
Knowledge (581)
Hadoop (0)

Notice

  • 메타 블로그 사이트에 등록
  • 새해 맞이 블로그의 변화
  • 블로그 명칭 변경
  • 도메인(www.webdizen.net) 구...
  • TEXTCUBE 1.6.1로 업그레이드...

Tags

  • 대한민국
  • 미러링
  • 웹 브라우저
  • 퍼즐
  • Perl
  • IDS
  • 메타 블로그
  • 프로세스 복사본
  • 마주앙 와인
  • 윈도우 모바일 7.0
  • 세면도구
  • QoS
  • 로그
  • SQL Server
  • 망각곡선
  • 스킨
  • RC0
  • 경청
  • 정치인
  • 이벤트 모델링

Recent Articles

  • ASCII Code의 CRLF 제거 방법.
  • Hadoop 에서 c++ API 이용시....
  • Ubuntu Linux에서 Hadoop 구....
  • 내 심장을 한껏 뛰게한 "국가....
  • 스타 스키마 데이터베이스 설....

Recent Comments

  • ■ 온라인카지노 ▶ http://L....
    asdf 11/21
  • 그리고 혹시 해외여행자보험....
    kim 11/05
  • ★★실제 바다게임장과 똑같....
    asdf 11/04
  • sbsyama.co.to← 짱5000만당....
    asdf 11/04
  • ♡KicaZ??o(???) 바카라사....
    fdsf3fass 11/03

Recent Trackbacks

  • 파일 열기/저장하기 CFileDialog.
    은마군의 나태블록 02/11
  • World IT Show 2008.
    상우 :: Oranzie's BLOG 2008
  • cvs서버 설치하기.
    3인3색 2008
  • 속속 공개되는 Google Chart....
    PHP와 Web 2.0 2007
  • 마방진을 구하는 프로그램.
    Oranzie's BLOG 3 2007

Archive

  • 2009/09 (3)
  • 2009/08 (1)
  • 2009/03 (1)
  • 2009/02 (9)
  • 2009/01 (13)

Calendar

«   2009/11   »
일 월 화 수 목 금 토
1 2 3 4 5 6 7
8 9 10 11 12 13 14
15 16 17 18 19 20 21
22 23 24 25 26 27 28
29 30          

Bookmarks

    • Administration
      • IIS.NET
      • NTFAQ
      • OS의 모든 것
      • 리눅스포털
    • Database
      • SQL Server Central
      • SQL Team
    • Development
      • .NET Heaven
      • ASP Alliance
      • ASP.NET 2.0
      • Bullog.net
      • C# Corner
      • C++ (C PlusPlus.com)
      • C++ Reference
      • CodeGuru
      • CodePlex
      • DebugLab
      • Dev Articles
      • Devpia
      • DotNet Junkies
      • DotNet Zone
      • Driver Online
      • GOSU.NET
      • HOONS 닷넷
      • Joinc 팀블로그
      • KOSR
      • MSDN Home Page
      • OSR Online
      • Sky.ph - 개발자 커뮤니...
      • TAEYO.NET
      • The Code Project
      • WindowsClient.net
      • 김상욱의 개발자 Side
      • 조인시 위키
    • Human Networks
      • belief21c's e-space
      • I think I can
      • Invisible Rover's Blog :D
      • Rodman®
      • ■ Feel So Good~! ■
      • 까만 나비
      • 나를 가꾸는 시간.
      • 나만의 즐거움~~!
      • 단녕
      • 상우 :: Oranzie's BLOG
    • Information Technology
      • Microsoft TechNet
      • 지디넷코리아 - 글로벌...
    • Security
      • FoundStone
      • milw0rm
      • NewOrder
      • OpenRCE
      • Phrack.org
      • Reverse Engineering b1...
      • Reverse Engineering Team
      • RootKit
      • SecurityFocus
      • SecurityXploded by Nag...
      • Wow Hacker
      • Zone-H
Textcube
Louice Studio Inc.
Powered by Textcube. Original designed by Tistory.