U E D R S I H C RSS
ID
Password
Join
์—ญ์‚ฌ๋Š” ์ด๋ ‡๊ฒŒ ๊ธฐ๋กํ•  ๊ฒƒ์ด๋‹ค. ์ด ์‚ฌํšŒ์  ์ „ํ™˜๊ธฐ์˜ ์ตœ๋Œ€ ๋น„๊ทน์€ ์•…ํ•œ ์‚ฌ๋žŒ๋“ค์˜ ๊ฑฐ์นœ ์•„์šฐ์„ฑ์ด ์•„๋‹ˆ๋ผ, ์„ ํ•œ ์‚ฌ๋žŒ๋“ค์˜ ์†Œ๋ฆ„๋ผ์น˜๋Š” ์นจ๋ฌต์ด์—ˆ๋‹ค๊ณ . โ€•๋งˆํ‹ด ๋ฃจํ„ฐ ํ‚น

๋ชฉ์ฐจ #

Contents

1 ๋ชฉ์ฐจ
2 ์‹œ์ž‘ํ•˜๋ฉฐ
3 Overapped I/O๋ฅผ ์™œ ์‚ฌ์šฉํ•˜์ง€?
4 ์ ์šฉ๋˜๋Š” ํ•จ์ˆ˜๋“ค
4.1 ์‹คํ–‰์˜ˆ
4.2 ๊ฐ ํ•จ์ˆ˜๋“ค์˜ ์ •์˜
5 MSDN ๋ฒˆ์—ญ - Overlapped I/O ๊ฐœ์š” ๋ฐ ์š”์•ฝ

2 ์‹œ์ž‘ํ•˜๋ฉฐ #

  • ์ด ๊ฐ•์ขŒ๋Š” C/C++๊ณผ ๊ธฐ๋ณธ socketํ•จ์ˆ˜์— ๋Œ€ํ•œ ์ง€์‹, Win32 API์— ๋Œ€ํ•œ ์ง€์‹์„ ์šฐ์„ ์œผ๋กœ ํ•ฉ๋‹ˆ๋‹ค.
  • Visual C++ 6.0์„ ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ์„ ์›์น™์œผ๋กœ ํ•ฉ๋‹ˆ๋‹ค. (๋ญ, ๊ฐ•์ขŒ์—์„œ ๊ทธ๋ ‡๊ฒŒ ํ‹ฐ๊ฐ€ ๋‚˜์ง„ ์•Š์Šต๋‹ˆ๋‹ค. ^^)
  • ๋„คํŠธ์›Œํฌ ์šฉ์–ด์— ๋Œ€ํ•ด์„œ ์•ฝํ•˜๋‹ค๊ณ  ์ƒ๊ฐ๋˜์‹œ๋Š” ๋ถ„์€ [http]์‹ฌํ˜•์„ญ์˜ ๋„คํŠธ์›Œํฌ ๊ฐœ๋…์ •๋ฆฌ๋ฅผ ํ•œ๋ฒˆ ์ˆ™์ง€ํ•˜์‹œ๊ธฐ ๋ฐ”๋ž๋‹ˆ๋‹ค. ๋‚˜๋ฆ„๋Œ€๋กœ ์ž˜ ์ •๋ฆฌํ•œ ์‚ฌ์ดํŠธ๋ผ๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค.
  • ํƒ€์ดํ•‘ ์ ˆ์•ฝ์„ ์œ„ํ•ด ์กด๋Œ€๋ง์„ ์ƒ๋žตํ•ฉ๋‹ˆ๋‹ค. :D ์ดํ•ด๋ฐ”๋ž๋‹ˆ๋‹ค.

3 Overapped I/O๋ฅผ ์™œ ์‚ฌ์šฉํ•˜์ง€? #

  • ์šฐ์„  ๊ธฐ์กด ์†Œ์ผ“ ํ•จ์ˆ˜๋Š” ๋ณด๋‚ด๊ธฐ/๋ฐ›๊ธฐ๋ฅผ ์ˆ˜ํ–‰ํ•˜๋Š”๋ฐ ์žˆ์–ด์„œ ๊ฐ๊ฐ์˜ ์—ญํ• ์„ ๋๋‚ด๊ธฐ๊นŒ์ง€ ๊ธฐ๋‹ค๋ ค์•ผ ํ•œ๋‹ค. ์ด๋Š” ๊ฐ„๋‹จํ•œ ์ฒ˜๋ฆฌ์—๋Š” ๊ดœ์ฐฎ์ง€๋งŒ ์กฐ๊ธˆ ํฌ๊ธฐ๊ฐ€ ํฐ ๋ฐ์ดํƒ€๋ฅผ ์ „์†กํ•œ๋‹ค๊ฑฐ๋‚˜ ํ•ด์„œ ์ „์†ก์ด ๋๋‚ ๋•Œ๊นŒ์ง€ ๊ฑธ๋ฆฌ๋Š” ์‹œ๊ฐ„์ด ์ข€ ๊ฑธ๋ฆฌ๊ฒŒ ๋ ๋•Œ ๊ทธ ์ดํ›„ ์ฒ˜๋ฆฌ๊ฐ€ ๋Šฆ์–ด์ง€๊ฒŒ ๋œ๋‹ค. ์ฆ‰, ๋‹ค์Œ๊ณผ ๊ฐ™์€ ํ˜„์ƒ์ด ๋ฐœ์ƒํ•œ๋‹ค. (์ด๋ฅผ blocking๋๋‹ค๊ณ  ํ”ํžˆ ์–˜๊ธฐํ•จ.)
    SOCKET samplesock;
    char data[255];
    ...
    recv(samplesock, (cahr *)data, 255);
    printf("%s", data); // ์ด ๋ถ€๋ถ„์€ recv()๊ฐ€ ์‹คํ–‰์ด ๋๋‚˜์•ผ ์‹คํ–‰๋œ๋‹ค.
    
  • ๋ฌผ๋ก , select(), WSAEventSelect(), WSAAsyncSelect()๋ฅผ ์‚ฌ์šฉํ•ด์„œ ์•„์–˜ ๋ฐ›๊ธฐ/๋ณด๋‚ด๊ธฐ๊ฐ€ ๊ฐ€๋Šฅํ•  ๋•Œ๋งŒ recv()/send()๋ฅผ ์‹คํ–‰ํ•˜๋ฉด ํ•ด๊ฒฐ๋˜๋Š” ๋ถ€๋ถ„์ด์ง€๋งŒ ์ด๊ฒƒ๋„ ๊ทผ๋ณธ์ ์ธ ๋ฌธ์ œ ํ•ด๊ฒฐ์€ ์•„๋‹ˆ๋‹ค. ์†Œ์ผ“ ํ”„๋กœ๊ทธ๋žจ์„ ์ž‘์„ฑํ•˜๋‹ค ๋ณด๋ฉด ๋ณด๋‚ด๊ธฐ/๋ฐ›๊ธฐ ์ž‘์—…์‹œ์ž‘ ์งํ›„์— ์–ด๋–ค ์ผ์„ ๋ฐ”๋กœ ์ˆ˜ํ–‰ํ•˜๋ฉด ์ข‹์„ ๊ฒฝ์šฐ๊ฐ€ ์žˆ๊ฒŒ ๋งˆ๋ จ์ด๋‹ค. (ํŠนํžˆ ์œ„ ์˜ˆ์ œ์—์„œ data๊ฐ€ ์•„์ฃผ ํฌ๊ธฐ๊ฐ€ ํฌ๋‹ค๋ฉด printf()๋ฌธ์ด ์‹คํ–‰๋˜๊ธฐ ์ „์—๋Š” ๋จนํ†ต์ด ๋œ ๊ฒƒ์ฒ˜๋Ÿผ ๋งˆ๋ƒฅ ๊ธฐ๋‹ค๋ ค์•ผ ํ•  ๊ฒƒ์ด๋‹ค.) ๊ทธ๋Ÿฌ๋ฉด ๋”ฐ๋กœ Thread๋ฅผ ์‚ฌ์šฉํ•ด์„œ ์ฝ”๋”ฉ์„? ์ด๊ฒƒ๋„ ๋„ˆ๋ฌด ๋ถ€๋‹ด์Šค๋Ÿฝ๋‹ค. (๋ฐ์ดํƒ€ ํ•˜๋‚˜ ์ „์†กํ•˜๋Š”๋ฐ ์“ฐ๋ ˆ๋“œ์”ฉ์ด๋‚˜... <:( )
  • ๊ทธ๋ž˜์„œ ๋ฐฑ๊ทธ๋ผ์šด๋“œ๋กœ ์‹คํ–‰์„ ์‹œ์ผœ๋†“๊ณ  ๋‹ค ๋ณด๋‚ด๊ฑฐ๋‚˜ ๋ฐ›์•„์ง€๋ฉด ์•Œ๋ ค์ฃผ๋Š” ๋ฐฉ๋ฒ•์ด ์žˆ๋‹ค๋ฉด ์ข‹๊ฒ ๋„ค...ํ•˜๋Š” ์ค‘์— ๋งŒ๋“ค์–ด์ง„ ๊ฒƒ์ด ๋ฐ”๋กœ Overlapped I/O์ด๋‹ค. ์ฆ‰, ์ด๊ฒƒ์€ ์šฐ์„  ๋ณด๋‚ด๊ธฐ/๋ฐ›๊ธฐ๋ฅผ ์‹คํ–‰ํ•˜๋„๋ก ์‹œํ‚ค๊ณ  ๋ฐ”๋กœ ๋‹ค์Œ ๋ช…๋ น์„ ์‹คํ–‰ํ•˜๋ฉฐ, ๊ทธ ์‹คํ–‰์ด ์™„๋ฃŒ๋˜๋ฉด 3๊ฐ€์ง€ ๋ฐฉ๋ฒ•์ค‘ ํ•˜๋‚˜๋ฅผ ํƒํ•ด ์ˆ˜ํ–‰์ด ์ข…๋ฃŒ๋˜์—ˆ๋Š”์ง€๋ฅผ ํŒŒ์•…ํ•˜๊ณ  ๊ทธ ๋‹ค์Œ ๋ช…๋ น์„ ์ˆ˜ํ–‰ํ•  ์ˆ˜ ์žˆ๋Š” ์‹œ์Šคํ…œ์ธ ๊ฒƒ์ด๋‹ค.

4 ์ ์šฉ๋˜๋Š” ํ•จ์ˆ˜๋“ค #

  • ๋ฐ˜๋“œ์‹œ Winsock2 ๋ฅผ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์–ด์•ผํ•œ๋‹ค. (๋ญ, ์–ด์งœํ”ผ ์šฐ๋ฆฌ๊ฐ€ ํ•ญ์ƒ ์‚ฌ์šฉํ•˜๋Š” ์ตœ๊ทผ๋ฒ„์ ผ์˜ ์†Œ์ผ“ํ•จ์ˆ˜๋‹ค. WSA...์–ด์ฉŒ๊ตฌ ํ•จ์ˆ˜๋“ค์€ Winsock2 ์ „์šฉํ•จ์ˆ˜๋“ค์ด๋‹ค.)
  • WSARecv(),WSASend(),WSARecvFrom(),WSASendTo()๊ฐ€ ๋ฐ”๋กœ ์˜ค๋ฒ„๋žฉ๋“œ์ž…์ถœ๋ ฅ์ด ์ง€์›๋˜๋Š” ํ•จ์ˆ˜๋“ค์ด๋‹ค. ๋ฌผ๋ก  ReadFile(), WriteFile()ํ•จ์ˆ˜๋“ค์—๋„ ์ ์šฉํ•  ์ˆ˜ ์žˆ์ง€๋งŒ, ์—ฌ๊ธฐ์„œ๋Š” ์†Œ์ผ“๋งŒ ์–˜๊ธฐํ•˜๋„๋ก ํ•˜๊ฒ ๋‹ค. (MSDN์„ ์ฝ์–ด๋ณด๋ฉด ์•„๋งˆ๋„ ReadFile(), WriteFile()์— ๋Œ€ํ•ด ์–ธ๊ธ‰์ด ๋˜์–ด์žˆ๋‹ค)
  • ๋ˆˆ์น˜์ฑ˜๊ฒ ์ง€๋งŒ, ๊ฐ๊ฐ์˜ ํ•จ์ˆ˜์˜ ์—ญํ• ์€ ์•„๋ž˜์™€ ๊ฐ™๋‹ค.
    WSARecv()TCP,๋ฐ›๊ธฐ
    WSARecvFrom()UDP,๋ฐ›๊ธฐ
    WSASend()TCP,๋ณด๋‚ด๊ธฐ
    WSASendTo()UDP,๋ณด๋‚ด๊ธฐ

4.1 ์‹คํ–‰์˜ˆ #

  • ์ž, ์šฐ์„ ์€ ๊ฐ„๋‹จํ•œ ์ฝ”๋“œ๋ฅผ ๋ณด์ž. ์ผ๋ฐ˜์ ์œผ๋กœ TCP์—์„œ ๋ฐ›๊ธฐ์— ์ด ๊ธฐ๋Šฅ์ด ๋งŽ์ด ์“ฐ์ด๋ฏ€๋กœ WSARecv()์— ๋Œ€ํ•œ ์˜ˆ๋ฅผ ๋“ค๊ฒ ๋‹ค. ๋‹ค์Œ ํ•จ์ˆ˜๋Š” ๋ฐฑ๊ทธ๋ผ์šด๋“œ๋กœ recv()๊ธฐ๋Šฅ์„ ์ˆ˜ํ–‰ํ•˜๋Š” ๊ฐ„๋‹จํ•œ ์˜ˆ์ด๋‹ค. ๋‹ค์Œ๊ณผ ๊ฐ™์ด ์„ ์–ธ๋˜์–ด์žˆ๋‹ค๊ณ  ๊ฐ€์ •ํ•˜์ž.
    char *recvBuf;    // ๋ฐ›์„ ์ž„์‹œ ๋ฒ„ํผ
    int recvBufLen;   // ๋ฒ„ํผ ํฌ๊ธฐ
    SOCKET sock;      // ์†Œ์ผ“ ํ•ธ๋“ค
    
    ์ด๋ ‡๊ฒŒ ์„ ์–ธ๋˜์–ด์žˆ๋‹ค๋ฉด ์ผ๋ฐ˜์ ์ธ recv()๋Š” ๋‹ค์Œ๊ณผ ๊ฐ™์„ ๊ฒƒ์ด๋‹ค.
    recv(sock, (char *)recvBuf, recvBufLen, 0);
    
    ์•„. ๊ฐ„๋‹จํžˆ ํ•œ ์ค„๋กœ ๋๋‚œ๋‹ค. :)) ํ•˜์ง€๋งŒ WSARecv()๋Š” ์–ด๋–ค์ง€ ๋ณด์ž.
    WSAOVERLAPPED wo;
    memset(&wo, 0, sizeof(WSAOVERLAPPED));
    wo.hEvent = WSACreateEvent();
    WSABUF tBuf;
    tBuf.len = recvBuflen;
    tBuf.buf = recvBuf;
    DWORD tRecvLen;
    DWORD tFlag = 0;
    WSARecv(sock, &tBuf, 1, &tRecvLen, &tFlag, &wo, NULL);
    
    ํ—ˆ๊ฑฐ๋ฉ. ์•ฝ๊ฐ„ ๋ณต์žกํ•˜๊ตฐ. ์œ„ ๋ฌธ์žฅ๋“ค์˜ ๊ฐ„๋‹จํ•œ ์˜๋ฏธ๋Š”, ์ผ๋‹จ tBuf์— ๋“ฑ๋กํ•œ ๋ฉ”๋ชจ๋ฆฌ์— sock์œผ๋กœ ๋„˜๊ฒจ์ ธ์˜ค๋Š” ๋ฐ์ดํƒ€๋ฅผ ๋ชจ๋‘ ๋‹ด๊ณ  ๋‹ค ๋‹ด์•„์ง€๋ฉด wo.hEvent์— ์„ค์ •๋œ ์ด๋ฒคํŠธ ๊ฐ์ฒด๋ฅผ ์‹œ๊ทธ๋„ํ•ด์ค˜๋ผ๋Š” ์˜๋ฏธ์ด๋‹ค. :(
  • ์œ„์˜ ๋‘ ๋ฐ›๊ธฐ ์˜ˆ์ œ์˜ ์‹คํ–‰์ƒ์˜ ์ฐจ์ด๋Š” recv()๋Š” ๋‹ค ๋ฐ›์•„์งˆ๋•Œ๊นŒ์ง€ ๊ธฐ๋‹ค๋ฆฌ๋Š” ํ•œํŽธ, WSARecv() ์‹คํ–‰์ฆ‰์‹œ ๋‹ค์Œ ๋ช…๋ น์„ ์‹คํ–‰ํ•œ๋‹ค๋Š” ๊ฒƒ์ด๋‹ค. ๋‹ค์‹œ ํ•œ๋ฒˆ ๋งํ•˜์ง€๋งŒ, ๋งŒ์ผ ๋‹ค ๋ฐ›์„๋•Œ๊นŒ์ง€ ์•„๋ฌด์ผ๋„ ์•ˆํ•˜๊ณ  ๋งˆ๋ƒฅ ๊ธฐ๋‹ค๋ ค๋„ ๋œ๋‹ค๋ฉด Overlapped I/O๋Š” ์‚ฌ์šฉํ•˜์ง€ ์•Š์•„๋„ ๋œ๋‹ค.

4.2 ๊ฐ ํ•จ์ˆ˜๋“ค์˜ ์ •์˜ #

(์ค‘๋žต. MSDN์ฐธ์กฐ.)

5 MSDN ๋ฒˆ์—ญ - Overlapped I/O ๊ฐœ์š” ๋ฐ ์š”์•ฝ #

Overlapped I/O๋Š” Win32 ์‹œ์Šคํ…œ ๋‚ด์—์„œ ์„ค์น˜๋œ ๋ชจ๋ธ์— ๋”ฐ๋ฅด๋ฉฐ, ๋‹จ์ง€ WSA_FLAG_OVERLAPPED ์˜ต์…˜์„ ๊ฐ€์ง„ WSASocket ํ•จ์ˆ˜๋ฅผ ํ†ตํ•˜์—ฌ ์ƒ์„ฑ๋œ ์†Œ์ผ“๋“ค๋งŒ ์‹คํ–‰๋  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

Overlapped์†์„ฑ์„ ๊ฐ€์ง„ ์†Œ์ผ“์„ ์ƒ์„ฑํ•˜๋Š” ๊ฒƒ์€ ์†Œ์ผ“์ด blocking์ด๋ƒ nonblocking์ด๋ƒ์˜ ์—ฌ๋ถ€์— ๋Œ€ํ•ด์„œ๋Š” ์˜ํ–ฅ์ด ์—†์Šต๋‹ˆ๋‹ค. Overlapped ์†์„ฑ์„ ๊ฐ€์ง€๊ณ  ์ƒ์„ฑ๋œ ์†Œ์ผ“๋“ค์€ ์†Œ์ผ“์˜ ๋ธ”๋กํ‚น ๋ชจ๋“œ๋ฅผ ๋ณ€๊ฒฝํ•˜๋Š” ์ผ์—†์ด Overlapped I/O๋ฅผ ์‹คํ–‰ํ•˜๋Š”๋ฐ ์‚ฌ์šฉ๋  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. Overlapped I/O ๊ธฐ๋Šฅ์ด ๋ธ”๋ก๋˜์ง€ ์•Š๋Š” ๊นŒ๋‹ญ์—, ์†Œ์ผ“์˜ ๋ธ”๋กํ‚น ๋ชจ๋“œ๋Š” ์ด ์ž‘๋™๊ณผ๋Š” ๊ด€๋ จ์ด ์—†์Šต๋‹ˆ๋‹ค.

๋ฐ›๊ธฐ ์ฒ˜๋ฆฌ๋ฅผ ์œ„ํ•ด์„œ, ๋„์ฐฉํ•˜๊ฒŒ ๋  ๋ฐ์ดํƒ€๋“ค์ด ๋‹ด๊ธธ ๋ฒ„ํผ๋“ค์„ ์ œ๊ณตํ•˜๊ธฐ์œ„ํ•ด WSARecv์™€ WSARecvFrom ํ•จ์ˆ˜๋ฅผ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค. ๋„คํŠธ์›Œํฌ์— ์˜ํ•ด ๋„์ฐฉํ•˜๊ฒŒ ๋˜๋Š” ์ˆœ๊ฐ„๋ณด๋‹ค ์•ž์„œ์„œ ํ•œ๊ฐœ์ด์ƒ์˜ ๋ฒ„ํผ๋“ค์ด ํ†ต๋ณด๋˜๋ฉด, ๋„์ฐฉํ•˜๋Š” ๊ฒƒ๊ณผ ๋™์‹œ์— ์ฆ‰์‹œ ์‚ฌ์šฉ์ž์˜ ๋ฒ„ํผ๋“ค์— ๋ฐ์ดํƒ€๊ฐ€ ๋‹ด๊ธฐ๊ฒŒ ๋  ๊ฒƒ ์ž…๋‹ˆ๋‹ค. ๋”ฐ๋ผ์„œ, ๋‹ค๋ฅธ ํ•œํŽธ์œผ๋กœ recv์™€ recvfromํ•จ์ˆ˜๊ฐ€ ๋ฐœ๋™๋˜์–ด ์ผ์–ด๋‚  ์ˆ˜ ์žˆ๋Š” ๋ณต์‚ฌ ์ž‘์—…์„ ํ”ผํ•  ์ˆ˜ ์žˆ๋„๋ก ํ•ฉ๋‹ˆ๋‹ค. ๋งŒ์ผ ๋ฒ„ํผ๊ฐ€ ํ†ต๋ณด๋˜๊ธฐ ์ „์— ๋ฐ์ดํƒ€๊ฐ€ ์กด์žฌํ•œ๋‹ค๋ฉด, ๋ฐ์ดํƒ€๋Š” ์ฆ‰์‹œ ์‚ฌ์šฉ์ž์˜ ๋ฒ„ํผ๋“ค๋กœ ๋ณต์‚ฌ๋ฉ๋‹ˆ๋‹ค.

๋งŒ์ผ ๋ฐ›๊ธฐ์ „์šฉ ๋ฒ„ํผ๊ฐ€ ๊ณตํ‘œ๋˜์ง€ ์•Š์€ ์ƒํƒœ์—์„œ ๋ฐ์ดํƒ€๊ฐ€ ๋„์ฐฉํ–ˆ์„ ๊ฒฝ์šฐ, ๋„คํŠธ์›Œํฌ๋Š” ๋ฐ›๊ธฐ ๋ช…๋ น์˜ ์นœ์ˆ™ํ•œ ๋™๊ธฐํ™” ์Šคํƒ€์ผ์— ์˜์กดํ•ฉ๋‹ˆ๋‹ค. ์ •ํ™•ํžˆ ๋งํ•˜๋ฉด, ๋“ค์–ด์˜ค๋Š” ๋ฐ์ดํƒ€๋Š” ํ”„๋กœ๊ทธ๋žจ์—์„œ ๋ฐ›๊ธฐ๋ช…๋ น์„ ํ˜ธ์ถœํ•˜๊ณ  ๊ทธ๊ฒƒ์— ์˜ํ•ด์„œ ๋ฐ์ดํƒ€๊ฐ€ ๋ณต์‚ฌ๋  ๋ฒ„ํผ๊ฐ€ ์ œ๊ณต๋ ๋•Œ๊นŒ์ง€ ๋‚ด๋ถ€์ ์œผ๋กœ ๋ฒ„ํผ์— ๋‹ด๊ธฐ๊ฒŒ ๋ฉ๋‹ˆ๋‹ค.

์ด๊ฒƒ์˜ ์˜ˆ์™ธ๋Š” ํ”„๋กœ๊ทธ๋žจ์ด setsockoptํ•จ์ˆ˜๋ฅผ ์‚ฌ์šฉํ•ด์„œ ํ•ด๋‹น ์†Œ์ผ“์˜ ๋ฐ›๊ธฐ ๋ฒ„ํผ๋ฅผ 0์œผ๋กœ ์ง€์ •ํ–ˆ์„ ๊ฒฝ์šฐ์ž… ๋‹ˆ๋‹ค. ์ด ๊ฒฝ์šฐ์—๋Š”, TCP์ผ ๊ฒฝ์šฐ๋Š” ํ”„๋กœ๊ทธ๋žจ์˜ ๋ฒ„ํผ๋“ค์ด ํ†ต๋ณด๋˜์—ˆ์„ ์ˆœ๊ฐ„์—๋งŒ ๋‹จ์ง€ ๋ฐ์ดํƒ€๋ฅผ ๋ฐ›๊ฒŒ ๋  ๊ฒƒ์ด๊ณ (๊ทธ๋ ‡์ง€ ์•Š์œผ๋ฉด ํด๋ผ์ด์–ธํŠธ๋Š” ๋Œ€๊ธฐ์ƒํƒœ์ž„), UDP์ผ ๊ฒฝ์šฐ์—๋Š” ๋ฐ์ดํƒ€๋ฅผ ์žƒ๊ฒŒ ๋ฉ๋‹ˆ๋‹ค.

๋ณด๋‚ผ ๋•Œ์˜ ๊ฒฝ์šฐ์—์„œ๋Š” ํ”„๋กœ๊ทธ๋žจ์€ ๋ฐ์ดํƒ€๊ฐ€ ๋‹ด๊ธด ๋ฒ„ํผ๋“ค์˜ ํฌ์ธํ„ฐ๋ฅผ ์ œ๊ณตํ•˜๊ณ  ๋„คํŠธ์›Œํฌ๊ฐ€ ๋ฒ„ํผ์˜ ๋‚ด์šฉ๋“ค์„ ํด๋ผ์ด์–ธํŠธ๋กœ ๋ณด๋‚ผ ๋•Œ๊นŒ์ง€ ์–ด๋–ค ๊ฒฝ๋กœ๋“ ์ง€ ๋ฒ„ํผ๋“ค์„ ๊ดด๋กญํžˆ๋Š” ๊ฒƒ์„ ๋ง‰๊ธฐ์œ„ํ•ด WSASend์™€ WSASendTo ํ•จ์ˆ˜๋ฅผ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค.

Overapped๋œ send/receive ํ˜ธ์ถœ์€ ์ฆ‰์‹œ ๋ฐ˜ํ™˜๋ฉ๋‹ˆ๋‹ค. ๋ฐ˜ํ™˜๊ฐ’์€ ์ฆ‰์‹œ ๋ชจ๋“  ์ž…์ถœ๋ ฅ ์ฒ˜๋ฆฌ๊ฐ€ ๋๋‚ฌ์„ ๊ฒฝ์šฐ์—๋Š” 0์ด ๋˜๊ณ , ๊ทธ์— ๋”ฐ๋ฅธ completion ์‹ ํ˜ธ๊ฐ€ ์ฆ‰์‹œ ๋ฐœ์ƒํ•˜๊ฒŒ ๋ฉ๋‹ˆ๋‹ค. ์ •ํ™•ํžˆ ๋งํ•˜๋ฉด, ์—ฐ๊ด€๋˜์–ด์žˆ๋Š” event ๊ฐ์ฒด๊ฐ€ ์‹œ๊ทธ๋„๋˜๊ฑฐ๋‚˜ completion routine์ด ํ์— ์ ์žฌ๋˜๊ณ , ํ˜ธ์ถœํ•œ ์“ฐ๋ž˜๋“œ๊ฐ€ ๊ฒฝ๊ณ ๊ฐ€๋Šฅํ•œ ๋Œ€๊ธฐ์ƒํƒœ๊ฐ€ ๋ ๋•Œ ์‹คํ–‰๋  ๊ฒƒ ์ž…๋‹ˆ๋‹ค.

WSA_IO_PENDING ์—๋Ÿฌ์ฝ”๋“œ์™€ ๊ฐ™์ด ๋„˜์–ด์˜ค๋Š” SOCKET_ERROR๊ฐ€ ๋ฐ˜ํ™˜๊ฐ’์ผ ๊ฒฝ์šฐ, ์ด๊ฒƒ์€ Overlapped ์ฒ˜๋ฆฌ๊ฐ€ ์„ฑ๊ณต์ ์œผ๋กœ ์ดˆ๊ธฐํ™” ๋˜๊ณ , ์ „์†ก์ค‘์ด๊ฑฐ๋‚˜ ์ „์†ก์ด ๋๋‚ ๋•Œ์— ์ œ๊ณต๋˜๋Š” ๋ถ€์ˆ˜์ ์ธ ์‹ ํ˜ธ๊ฐ€ ์ œ๊ณต๋œ๋‹ค๋Š” ๊ฒƒ์„ ์˜๋ฏธํ•œ๋‹ค. ์–ด์จŒ๊ฑฐ๋‚˜, streamํ˜•์‹์˜ ์†Œ์ผ“์—์„œ Completion ์‹ ํ˜ธ๋Š” ๋ฒ„ํผ๋“ค์ด ๊ฐ€๋“ ์ฐจ๋Š” ๊ฒƒ๊ณผ๋Š” ๊ด€๊ณ„์—†์ด ๋“ค์–ด์˜ค๋Š” ๋ฐ์ดํƒ€๊ฐ€ ๊ณ ๊ฐˆ๋ ๋•Œ๋งˆ๋‹ค ๋ฐœ์ƒํ•ฉ๋‹ˆ๋‹ค. ์œ„์™€ ๋‹ค๋ฅธ ๋‚˜๋จธ์ง€ ์—๋Ÿฌ์ฝ”๋“œ๋Š” Overlapped ์‹ ํ˜ธ๊ฐ€ ์ดˆ๊ธฐํ™”๋˜์ง€ ์•Š์•˜์œผ๋ฉฐ, Completed ์‹ ํ˜ธ๊ฐ€ ๋ฐœ์ƒํ•˜์ง€ ์•Š๋Š”๋‹ค๋Š” ๊ฒƒ์„ ์˜๋ฏธํ•ฉ๋‹ˆ๋‹ค.

๋ณด๋‚ด๊ธฐ์™€ ๋ฐ›๊ธฐ ์ฒ˜๋ฆฌ ๋‘˜๋‹ค Overlapped ์„ค์ •์ด ๊ฐ€๋Šฅํ•ฉ๋‹ˆ๋‹ค. ๋ฐ›๊ธฐ ํ•จ์ˆ˜๋“ค์€ ๋“ค์–ด์˜ค๋Š” ๋ฐ์ดํƒ€์— ๋Œ€๋น„ํ•˜๊ธฐ ์œ„ํ•œ ๋ฐ›๊ธฐ์šฉ ๋ฒ„ํผ๋“ค์„ ํ†ต๋ณดํ•˜๊ธฐ ์œ„ํ•ด ์—ฌ๋Ÿฌ๋ฒˆ ํ˜ธ์ถœ๋  ์ˆ˜ ์žˆ์œผ๋ฉฐ, ๋ณด๋‚ด๊ธฐ ํ•จ์ˆ˜๋“ค์€ ๋ณด๋‚ด๊ธฐ ์ฒ˜๋ฆฌ๋ฅผ ์œ„ํ•œ ์—ฌ๋Ÿฌ๊ฐœ์˜ ๋ฒ„ํผ๋“ค์„ ํ์— ๋“ฑ๋กํ•˜๊ธฐ ์œ„ํ•ด ์—ฌ๋Ÿฌ๋ฒˆ ํ˜ธ์ถœ๋  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

ํ”„๋กœ๊ทธ๋žจ์ด ์ง€์ •๋œ ์ˆœ์„œ๋Œ€๋กœ ๋ณด๋‚ด์ง€๊ณ  ์žˆ๋Š” Overlapped ์„ค์ •๋œ ๋ณด๋‚ด๊ธฐ์šฉ ๋ฒ„ํผ๋“ค์˜ ์ง‘ํ•ฉ์— ์˜์ง€ํ•  ์ˆ˜ ์žˆ์„ ๋™์•ˆ, ๊ทธ์— ๋”ฐ๋ผ์˜ค๋Š” Completion ์‹ ํ˜ธ๋Š” ๋‹ค๋ฅธ ์ˆœ์„œ๋กœ ๋ฐœ์ƒํ•  ์ˆ˜๋„ ์žˆ์Šต๋‹ˆ๋‹ค. ๋น„์Šทํ•˜๊ฒŒ๋„, ๋ฐ›๋Š” ์ฒ˜๋ฆฌ์˜ ์ž…์žฅ์—์„œ๋Š” ๋ฒ„ํผ๋“ค์€ ์ œ๊ณต๋œ ์ˆœ์„œ๋Œ€๋กœ ์ฑ„์›Œ์งˆ ์ˆ˜ ์žˆ์ง€๋งŒ, Completion ์‹ ํ˜ธ๋Š” ๋‹ค๋ฅธ ์ˆœ์„œ๋Œ€๋กœ ์˜ฌ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

ํ•ด๋‹น ์“ฐ๋ ˆ๋“œ ์ƒ์—์„œ์˜ ์—ฌ๋Ÿฌ๊ฐœ์˜ Completion ์‹ ํ˜ธ๋ฅผ ๊ฐ์ง€ํ•˜๊ธฐ ์œ„ํ•ด์„œ๋Š” ์•„๋ฌด ์—ญํ• ๋„ ํ•˜์ง€ ์•Š๋Š” ๋”๋ฏธ Event ๊ฐ์ฒด๋ฅผ ์ƒ์„ฑํ•˜๊ณ , ์ด ๊ฐ์ฒด์— bAlert๊ฐ€ true์ธ WSAWaitForMultipleEvents ํ•จ์ˆ˜๋ฅผ ์‹คํ–‰์‹œ์ผœ ํ˜„์žฌ ์“ฐ๋ ˆ๋“œ์˜ Overlapped I/O์ค‘ ์ ์–ด๋„ ํ•˜๋‚˜๊ฐ€ Completion๋˜์—ˆ๋‹ค๋Š” ๊ฒƒ์„ ๊ฐ์ง€ํ•ฉ๋‹ˆ๋‹ค. ์œ„ ํ•จ์ˆ˜๋Š” SleepEx ํ•จ์ˆ˜๋กœ ๋Œ€์ฒดํ•ด์„œ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. (๊ฐ™์€ ์—ญํ• ์ž…๋‹ˆ๋‹ค)

WSAWaitForMultipleEvents์™€ SleepEx ํ•จ์ˆ˜๋Š” ๊ทธ์ € ์ข…๋ฃŒ์—ฌ๋ถ€๋ฅผ ๋‚˜ํƒ€๋‚ผ ๋ฟ ์„ฑ๊ณต์ ์œผ๋กœ ๋๋‚ฌ๋Š”์ง€ ์—ฌ๋ถ€๋Š” ์•Œ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค. Overapped I/O ์ฒ˜๋ฆฌ๊ฐ€ ์ •์ƒ์ ์œผ๋กœ ๋๋‚ฌ๋Š”์ง€ ์—ฌ๋ถ€๋Š” WSAGetOverlappedResult ํ•จ์ˆ˜๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ์•Œ์•„๋ƒ…๋‹ˆ๋‹ค.

์ฃผ์–ด์ง„ ์†Œ์ผ“์— ๋Œ€๊ธฐํ•˜๊ณ  ์žˆ๋Š” ๊ฐœ๋ณ„์ ์ธ Overlapped ๋ช…๋ น์„ ์ทจ์†Œํ•˜๋Š” ๊ฒƒ์€ ๋ถˆ๊ฐ€๋Šฅํ•ฉ๋‹ˆ๋‹ค. ํ•˜์ง€๋งŒ closesocket ํ•จ์ˆ˜๋Š” ์†Œ์ผ“์„ ๋‹ซ๋„๋ก ๋ช…๋ นํ•  ์ˆ˜ ์žˆ๊ณ , ๋ชจ๋“  ๋Œ€๊ธฐ์ค‘์ธ ๋ช…๋ น๋“ค์„ ์ฆ‰์‹œ ์ทจ์†Œํ•˜๋„๋ก ๋งŒ๋“ญ๋‹ˆ๋‹ค. Overlapped I/O์˜ ์ถ”๊ฐ€ Completion ์„ค์ •๋“ค์€ WSAIoctl ํ•จ์ˆ˜๋ฅผ ์‚ฌ์šฉํ•จ์œผ๋กœ์จ ๊ฐ€๋Šฅํ•ฉ๋‹ˆ๋‹ค.

๋‹ค์Œ์€ Overlapped I/O์˜ ๋‘๊ฐ€์ง€์˜ ํ˜•ํƒœ์— ๋Œ€ํ•ด ์„ค๋ช…ํ•œ ๋ถ€๋ถ„์ž…๋‹ˆ๋‹ค. (hEvent๋Š” lpOverlapped ๊ตฌ์กฐ์ฒด์— ์„ค์ •ํ•˜๋Š” event ๊ฐ์ฒด์˜ ํ•ธ๋“ค๊ฐ’์„ ์˜๋ฏธํ•ฉ๋‹ˆ๋‹ค.)

lpOverlappedhEventlpCompletionRoutineCompletion ์—ฌ๋ถ€ ์‹๋ณ„
NULL๋‹น์—ฐํžˆ ์…‹ํŒ…๋ถˆ๊ฐ€๋Šฅ๋ฌด์‹œ๋จ๋™๊ธฐ์ ์œผ๋กœ ์‹คํ–‰๋จ. (๊ธฐ๋ณธ socketํ•จ์ˆ˜์™€ ๋™์ผ)
NULL์•„๋‹˜NULLNULLOverapped์ƒํƒœ๋กœ ๋™์ž‘. ํ•˜์ง€๋งŒ ์™„๋ฃŒ์—ฌ๋ถ€์ฑ„ํฌ๋ถˆ๊ฐ€๋Šฅ
NULL์•„๋‹˜NULL์•„๋‹˜NULLOverapped์ƒํƒœ๋กœ ๋™์ž‘. ์™„๋ฃŒ์—ฌ๋ถ€๋Š” Event ๊ฐ์ฒด๋กœ ์ฑ„ํฌ.
NULL์•„๋‹˜๋ฌด์‹œ๋จNULL์ด ์•„๋‹˜Overapped์ƒํƒœ๋กœ ๋™์ž‘. ์™„๋ฃŒ์—ฌ๋ถ€๋Š” completion routine์„ ํ†ตํ•ด์„œ ๊ด€๋ฆฌ.

Valid XHTML 1.0! Valid CSS! powered by MoniWiki
last modified 2010-10-28 12:42:54
Processing time 0.5039 sec