SlideShare a Scribd company logo
1 of 17
Winsock
winsock
 Windows Socket API의 줄임말로, 윈도 운영체제 기반의 네트워크 프로그램을 개발하기 위한 기술
요소들이 적용된 개발 도구
 BSD socket을 기반으로 하고 있어서 리눅스 환경과 유사
BSD Socket과의 차이점
 BSD Socket API의 거의 전부를 그대로 사용할 수 있다.
 dll 로드 : winsock.dll을 로딩해야 한다.
 소켓 지정 번호 : 리눅스는 소켓 지정 번호가 곧 파일 지정 번호로 자료형은 signed int이다. 윈속은
소켓을 가리키기 위해서 SOCKET을 사용하는데, unsigned int 형이다. 그러므로 포팅 작업을 쉽게
하기 위해서 int형dmf 사용해도 큰 문제는 없다. 대신 컴파일러의 종류에 따라서 warining
message를 출력할 수도 있다. 가능하면 SOCKET 자료형을 그대로 사용하는 것이 좋다.
TCP
 상위계층
 메시지나 파일들을 좀더 작은 패킷으로 나누어 인터넷을 통해 전송하는 일을 담당
 수신된 패킷들을 원래의 메시지로 재조립하는 일을 담당
IP
 하위계층
 각 패킷의 주소 부분을 처리함으로써, 패킷들이 목적지에 정확하게 도달할 수 있게 한다.
TCP/IP
 네트워크 상의 각 게이트웨이는 메시지를 어느 곳으로 전달해야 할지를 알기 위해, 메시지의 주소를
확인한다.
 한 메시지가 여러 개의 패킷으로 나뉘어진 경우 각 패킷들은 서로 다른 경로를 통해 전달될 수 있으
며, 그것들은 최종 목적지에서 재조립된다.
 client / server 모델을 사용하는데, client의 요구에 대응하여 네트워크 상의 server가 웹 페이지를
보내는 식의 서비스를 제공한다.
 connectionless(네트워크를 독점하지 않으므로 모든 사람들이 그 경로를 공동을 사용할 수 있다.)
socket
 인터넷 상에서 물리적으로 떨어져있는 소프트웨어와 소프트웨어 간의 통신을 담당하는 „소프트웨어
통신 도구„
 인터넷의 종단에 위치하면서 소프트웨어와 소프트웨어를 연결한다.
socket 예시
Firefox
socket
Apache
socketInternet
socket 예시
 socke은 clien인 firefox와 serve인 apache가 서로 통신할 수 있게 연결한다.
 socket을 이용하여 firefox는 apache서버로 웹페이지 요청을 하고, apache serve는 요청을 분석
해서 웹페이지를 firefox에 전송한다.
유닉스 socket 자료형
 유닉스는 모든 자월을 파일로 다룬다.
 socket 역시 예외는 아니다.
 모든 파일 관련 함수는 signed int형의 파일 지정 번호를 이용해서 파일을 제어한다.
 BSD socket도 int형의 파일 지정 번호를 이용해서 socke을 다룬다.
윈도우 socket 자료형
 windows는 자월을 파일이 아닌 각각의 독립된 커널 객체로 본다.
 파일 지정 번호가 아닌 HANDLE을 이용해서 제어한다.
 객체의 인스턴스를 다루는 방식이다.
 windows의 특성상 socket 역시 socket HANDLE로 다루어야 하겠지만, BSD 소켓과의 호환을 유재
하기 위해서 unsigned int를 재정의한 (소켓 지정 번호) SOCK으로 소켓을 다룬다.
 socket을 지시하기 때문에 socket 지시자라고 부른다.
 기본적으로 windows는 file과 socket을 다른 객체로 본다.
winsock 초기화
int WSAStartup { // winsock 초기화 함수
WORD wVersionRequested, // 프로그램이 요구하는 최상위 윈속 버전
LPWSADATA lpWSAData // WSADATA 타입 변수의 주소를 전달
}; // 이를 통해 시스템에서 제공하는 윈속 구현에 대한 세부사항을
// 얻을 수 있다.
int WSACleanup(void); // 윈속 사용을 중지함을 운영체제에 알리고 관련 리소스를
// 반환한다.
winsock 초기화 예제 코드
#include <winsock2.h>
int main(int argc, char * argv[])
{
// 윈속 초기화
WSADATA wsa;
if ( 0 != WSAstartup(MAKEWORD(2,2), &wsa)) // WSAstartup 함수는 성공 시 0
return -1;
MessageBox(NULL, “윈속 초기화 성공”, “성공“, MB_OK);
// 윈속 종료
WSACleanup();
return 0;
}
소켓 생성
 socket() 함수는 사용자가 요청한 프로토콜을 이용하여 통신을 할 수 있도록 내부적으로 리소스를
할당하고, 이를 접근할 수 있는 일종의 핸들값(SOCKET타입, 32비트 정수 )을 리턴한다.
 이 값을 소켓 디스크립터(socket descriptor)라 부르며, 각종 소켓 함수를 호출할 때 인자로 전달하
여 사용하게 된다.
SOCKET socket {
int af, // 주소 체계를 지정한다.
int type, // 소켓 타입을 지정한다.
int protocol // 사용할 프로토콜을 지정한다.
};
TCP를 사용하고자 한다면?
 주소 체계는 AF_INET
 소켓 타입은 SOCK_STREAM
 프로토콜은 IPPROTO_TCP 혹은 0도 가능하다.
소켓 닫기
 소켓을 이용한 통신이 끝나면 관련 리소스를 반환해야 한다.
int closesocket() {
SOCKET s
};
소켓 생성과 닫기 예제 코드
#include <stdio.h>
#include <winsock2.h>
int main(int argc, char * argv[])
{
WSADATA wsa; // 윈속 초기화
if (0 != WSAStartup(MAKEWORD(2,2,), &wsa))
return -1;
printf(“윈속 초기화 성공n”);
// socket()
SOCKET tcp_socket = socket(AF_INET, SOCK_STREAM,
0);
if(tcp_sck == INVALID_SOCKET)
printf(“소켓 생성 실패”);
printf(“소켓 생성 성공”);
// closesocket()
closesocket(tcp_socket);
WSACleanup();
return 0;
}

More Related Content

Similar to Winsock

유니티 + Nodejs를 활용한 멀티플레이어 게임 개발하기
유니티 + Nodejs를 활용한 멀티플레이어 게임 개발하기유니티 + Nodejs를 활용한 멀티플레이어 게임 개발하기
유니티 + Nodejs를 활용한 멀티플레이어 게임 개발하기Kiyoung Moon
 
Ch01 네트워크와+소켓+프로그래밍+[호환+모드]
Ch01 네트워크와+소켓+프로그래밍+[호환+모드]Ch01 네트워크와+소켓+프로그래밍+[호환+모드]
Ch01 네트워크와+소켓+프로그래밍+[호환+모드]지환 김
 
소켓프로그래밍 기초요약
소켓프로그래밍 기초요약소켓프로그래밍 기초요약
소켓프로그래밍 기초요약세빈 정
 
Python socket programming
Python socket programmingPython socket programming
Python socket programmingTae Young Lee
 
[NodeJS] - NET 모듈 소개
[NodeJS] - NET 모듈 소개[NodeJS] - NET 모듈 소개
[NodeJS] - NET 모듈 소개문학청년
 
Pwnable study basic_2
Pwnable study basic_2Pwnable study basic_2
Pwnable study basic_2Jinkyoung Kim
 
[Windows via c/c++] 4장 프로세스
[Windows via c/c++] 4장 프로세스[Windows via c/c++] 4장 프로세스
[Windows via c/c++] 4장 프로세스종빈 오
 
윈도우 커널 익스플로잇
윈도우 커널 익스플로잇윈도우 커널 익스플로잇
윈도우 커널 익스플로잇Seungyong Lee
 
Python으로 채팅 구현하기
Python으로 채팅 구현하기Python으로 채팅 구현하기
Python으로 채팅 구현하기Tae Young Lee
 
Node-RED Modbus sample (Node-RED 간단 사용법)
Node-RED Modbus sample (Node-RED 간단 사용법)Node-RED Modbus sample (Node-RED 간단 사용법)
Node-RED Modbus sample (Node-RED 간단 사용법)HyukSun Kwon
 
Node.js의 도입과 활용
Node.js의 도입과 활용Node.js의 도입과 활용
Node.js의 도입과 활용Jin wook
 
Nodejs발표자료 - 팀 세미나용
Nodejs발표자료 - 팀 세미나용 Nodejs발표자료 - 팀 세미나용
Nodejs발표자료 - 팀 세미나용 SuHyun Jeon
 
AWS Community Day 2022 - Nitro Enclave를 이용하여 안전하게 고객 정보 다...
AWS Community Day 2022 - Nitro Enclave를 이용하여 안전하게 고객 정보 다...AWS Community Day 2022 - Nitro Enclave를 이용하여 안전하게 고객 정보 다...
AWS Community Day 2022 - Nitro Enclave를 이용하여 안전하게 고객 정보 다...JooHyung Kim
 
오픈 소스 클라우드 플랫폼 분석
오픈 소스 클라우드 플랫폼 분석오픈 소스 클라우드 플랫폼 분석
오픈 소스 클라우드 플랫폼 분석Jennifer Noh
 
Interface and Protocol
Interface and ProtocolInterface and Protocol
Interface and ProtocolWonjun Hwang
 
파이썬+네트워크 20160210
파이썬+네트워크 20160210파이썬+네트워크 20160210
파이썬+네트워크 20160210Yong Joon Moon
 
Bash on Ubuntu on Windows
Bash on Ubuntu on WindowsBash on Ubuntu on Windows
Bash on Ubuntu on Windows흥배 최
 

Similar to Winsock (20)

유니티 + Nodejs를 활용한 멀티플레이어 게임 개발하기
유니티 + Nodejs를 활용한 멀티플레이어 게임 개발하기유니티 + Nodejs를 활용한 멀티플레이어 게임 개발하기
유니티 + Nodejs를 활용한 멀티플레이어 게임 개발하기
 
Ch01 네트워크와+소켓+프로그래밍+[호환+모드]
Ch01 네트워크와+소켓+프로그래밍+[호환+모드]Ch01 네트워크와+소켓+프로그래밍+[호환+모드]
Ch01 네트워크와+소켓+프로그래밍+[호환+모드]
 
소켓프로그래밍 기초요약
소켓프로그래밍 기초요약소켓프로그래밍 기초요약
소켓프로그래밍 기초요약
 
Python socket programming
Python socket programmingPython socket programming
Python socket programming
 
[NodeJS] - NET 모듈 소개
[NodeJS] - NET 모듈 소개[NodeJS] - NET 모듈 소개
[NodeJS] - NET 모듈 소개
 
Node week1
Node week1Node week1
Node week1
 
[9월 런치 세미나] 도커와 쿠버네티스 기술에 스며들다
[9월 런치 세미나] 도커와 쿠버네티스 기술에 스며들다[9월 런치 세미나] 도커와 쿠버네티스 기술에 스며들다
[9월 런치 세미나] 도커와 쿠버네티스 기술에 스며들다
 
Pwnable study basic_2
Pwnable study basic_2Pwnable study basic_2
Pwnable study basic_2
 
ice_grad
ice_gradice_grad
ice_grad
 
[Windows via c/c++] 4장 프로세스
[Windows via c/c++] 4장 프로세스[Windows via c/c++] 4장 프로세스
[Windows via c/c++] 4장 프로세스
 
윈도우 커널 익스플로잇
윈도우 커널 익스플로잇윈도우 커널 익스플로잇
윈도우 커널 익스플로잇
 
Python으로 채팅 구현하기
Python으로 채팅 구현하기Python으로 채팅 구현하기
Python으로 채팅 구현하기
 
Node-RED Modbus sample (Node-RED 간단 사용법)
Node-RED Modbus sample (Node-RED 간단 사용법)Node-RED Modbus sample (Node-RED 간단 사용법)
Node-RED Modbus sample (Node-RED 간단 사용법)
 
Node.js의 도입과 활용
Node.js의 도입과 활용Node.js의 도입과 활용
Node.js의 도입과 활용
 
Nodejs발표자료 - 팀 세미나용
Nodejs발표자료 - 팀 세미나용 Nodejs발표자료 - 팀 세미나용
Nodejs발표자료 - 팀 세미나용
 
AWS Community Day 2022 - Nitro Enclave를 이용하여 안전하게 고객 정보 다...
AWS Community Day 2022 - Nitro Enclave를 이용하여 안전하게 고객 정보 다...AWS Community Day 2022 - Nitro Enclave를 이용하여 안전하게 고객 정보 다...
AWS Community Day 2022 - Nitro Enclave를 이용하여 안전하게 고객 정보 다...
 
오픈 소스 클라우드 플랫폼 분석
오픈 소스 클라우드 플랫폼 분석오픈 소스 클라우드 플랫폼 분석
오픈 소스 클라우드 플랫폼 분석
 
Interface and Protocol
Interface and ProtocolInterface and Protocol
Interface and Protocol
 
파이썬+네트워크 20160210
파이썬+네트워크 20160210파이썬+네트워크 20160210
파이썬+네트워크 20160210
 
Bash on Ubuntu on Windows
Bash on Ubuntu on WindowsBash on Ubuntu on Windows
Bash on Ubuntu on Windows
 

More from 문익 장

Mec chapter 5,6
Mec chapter 5,6Mec chapter 5,6
Mec chapter 5,6문익 장
 
Mec++ chapter3,4
Mec++ chapter3,4Mec++ chapter3,4
Mec++ chapter3,4문익 장
 
Effective c++ chapter 7,8
Effective c++ chapter 7,8Effective c++ chapter 7,8
Effective c++ chapter 7,8문익 장
 
More effective c++ chapter1,2
More effective c++ chapter1,2More effective c++ chapter1,2
More effective c++ chapter1,2문익 장
 
Tcp server / client
Tcp server / clientTcp server / client
Tcp server / client문익 장
 
Effective c++(chapter 5,6)
Effective c++(chapter 5,6)Effective c++(chapter 5,6)
Effective c++(chapter 5,6)문익 장
 
삼각형으로 지면 만들기
삼각형으로 지면 만들기삼각형으로 지면 만들기
삼각형으로 지면 만들기문익 장
 
소켓 주소 구조체 다루기(윈도우 네트워크 프로그래밍)
소켓 주소 구조체 다루기(윈도우 네트워크 프로그래밍)소켓 주소 구조체 다루기(윈도우 네트워크 프로그래밍)
소켓 주소 구조체 다루기(윈도우 네트워크 프로그래밍)문익 장
 
3D Graphics Transform
3D Graphics Transform3D Graphics Transform
3D Graphics Transform문익 장
 
Direct3d overview
Direct3d overviewDirect3d overview
Direct3d overview문익 장
 
Effective c++(chapter3,4)
Effective c++(chapter3,4)Effective c++(chapter3,4)
Effective c++(chapter3,4)문익 장
 
Effective c++ Chapter1,2
Effective c++ Chapter1,2Effective c++ Chapter1,2
Effective c++ Chapter1,2문익 장
 

More from 문익 장 (15)

Mec chapter 5,6
Mec chapter 5,6Mec chapter 5,6
Mec chapter 5,6
 
Mec++ chapter3,4
Mec++ chapter3,4Mec++ chapter3,4
Mec++ chapter3,4
 
Effective c++ chapter 7,8
Effective c++ chapter 7,8Effective c++ chapter 7,8
Effective c++ chapter 7,8
 
More effective c++ chapter1,2
More effective c++ chapter1,2More effective c++ chapter1,2
More effective c++ chapter1,2
 
Std bind
Std bindStd bind
Std bind
 
C++ align
C++ alignC++ align
C++ align
 
Alignment
AlignmentAlignment
Alignment
 
Tcp server / client
Tcp server / clientTcp server / client
Tcp server / client
 
Effective c++(chapter 5,6)
Effective c++(chapter 5,6)Effective c++(chapter 5,6)
Effective c++(chapter 5,6)
 
삼각형으로 지면 만들기
삼각형으로 지면 만들기삼각형으로 지면 만들기
삼각형으로 지면 만들기
 
소켓 주소 구조체 다루기(윈도우 네트워크 프로그래밍)
소켓 주소 구조체 다루기(윈도우 네트워크 프로그래밍)소켓 주소 구조체 다루기(윈도우 네트워크 프로그래밍)
소켓 주소 구조체 다루기(윈도우 네트워크 프로그래밍)
 
3D Graphics Transform
3D Graphics Transform3D Graphics Transform
3D Graphics Transform
 
Direct3d overview
Direct3d overviewDirect3d overview
Direct3d overview
 
Effective c++(chapter3,4)
Effective c++(chapter3,4)Effective c++(chapter3,4)
Effective c++(chapter3,4)
 
Effective c++ Chapter1,2
Effective c++ Chapter1,2Effective c++ Chapter1,2
Effective c++ Chapter1,2
 

Winsock

  • 2. winsock  Windows Socket API의 줄임말로, 윈도 운영체제 기반의 네트워크 프로그램을 개발하기 위한 기술 요소들이 적용된 개발 도구  BSD socket을 기반으로 하고 있어서 리눅스 환경과 유사
  • 3. BSD Socket과의 차이점  BSD Socket API의 거의 전부를 그대로 사용할 수 있다.  dll 로드 : winsock.dll을 로딩해야 한다.  소켓 지정 번호 : 리눅스는 소켓 지정 번호가 곧 파일 지정 번호로 자료형은 signed int이다. 윈속은 소켓을 가리키기 위해서 SOCKET을 사용하는데, unsigned int 형이다. 그러므로 포팅 작업을 쉽게 하기 위해서 int형dmf 사용해도 큰 문제는 없다. 대신 컴파일러의 종류에 따라서 warining message를 출력할 수도 있다. 가능하면 SOCKET 자료형을 그대로 사용하는 것이 좋다.
  • 4. TCP  상위계층  메시지나 파일들을 좀더 작은 패킷으로 나누어 인터넷을 통해 전송하는 일을 담당  수신된 패킷들을 원래의 메시지로 재조립하는 일을 담당
  • 5. IP  하위계층  각 패킷의 주소 부분을 처리함으로써, 패킷들이 목적지에 정확하게 도달할 수 있게 한다.
  • 6. TCP/IP  네트워크 상의 각 게이트웨이는 메시지를 어느 곳으로 전달해야 할지를 알기 위해, 메시지의 주소를 확인한다.  한 메시지가 여러 개의 패킷으로 나뉘어진 경우 각 패킷들은 서로 다른 경로를 통해 전달될 수 있으 며, 그것들은 최종 목적지에서 재조립된다.  client / server 모델을 사용하는데, client의 요구에 대응하여 네트워크 상의 server가 웹 페이지를 보내는 식의 서비스를 제공한다.  connectionless(네트워크를 독점하지 않으므로 모든 사람들이 그 경로를 공동을 사용할 수 있다.)
  • 7. socket  인터넷 상에서 물리적으로 떨어져있는 소프트웨어와 소프트웨어 간의 통신을 담당하는 „소프트웨어 통신 도구„  인터넷의 종단에 위치하면서 소프트웨어와 소프트웨어를 연결한다.
  • 9. socket 예시  socke은 clien인 firefox와 serve인 apache가 서로 통신할 수 있게 연결한다.  socket을 이용하여 firefox는 apache서버로 웹페이지 요청을 하고, apache serve는 요청을 분석 해서 웹페이지를 firefox에 전송한다.
  • 10. 유닉스 socket 자료형  유닉스는 모든 자월을 파일로 다룬다.  socket 역시 예외는 아니다.  모든 파일 관련 함수는 signed int형의 파일 지정 번호를 이용해서 파일을 제어한다.  BSD socket도 int형의 파일 지정 번호를 이용해서 socke을 다룬다.
  • 11. 윈도우 socket 자료형  windows는 자월을 파일이 아닌 각각의 독립된 커널 객체로 본다.  파일 지정 번호가 아닌 HANDLE을 이용해서 제어한다.  객체의 인스턴스를 다루는 방식이다.  windows의 특성상 socket 역시 socket HANDLE로 다루어야 하겠지만, BSD 소켓과의 호환을 유재 하기 위해서 unsigned int를 재정의한 (소켓 지정 번호) SOCK으로 소켓을 다룬다.  socket을 지시하기 때문에 socket 지시자라고 부른다.  기본적으로 windows는 file과 socket을 다른 객체로 본다.
  • 12. winsock 초기화 int WSAStartup { // winsock 초기화 함수 WORD wVersionRequested, // 프로그램이 요구하는 최상위 윈속 버전 LPWSADATA lpWSAData // WSADATA 타입 변수의 주소를 전달 }; // 이를 통해 시스템에서 제공하는 윈속 구현에 대한 세부사항을 // 얻을 수 있다. int WSACleanup(void); // 윈속 사용을 중지함을 운영체제에 알리고 관련 리소스를 // 반환한다.
  • 13. winsock 초기화 예제 코드 #include <winsock2.h> int main(int argc, char * argv[]) { // 윈속 초기화 WSADATA wsa; if ( 0 != WSAstartup(MAKEWORD(2,2), &wsa)) // WSAstartup 함수는 성공 시 0 return -1; MessageBox(NULL, “윈속 초기화 성공”, “성공“, MB_OK); // 윈속 종료 WSACleanup(); return 0; }
  • 14. 소켓 생성  socket() 함수는 사용자가 요청한 프로토콜을 이용하여 통신을 할 수 있도록 내부적으로 리소스를 할당하고, 이를 접근할 수 있는 일종의 핸들값(SOCKET타입, 32비트 정수 )을 리턴한다.  이 값을 소켓 디스크립터(socket descriptor)라 부르며, 각종 소켓 함수를 호출할 때 인자로 전달하 여 사용하게 된다. SOCKET socket { int af, // 주소 체계를 지정한다. int type, // 소켓 타입을 지정한다. int protocol // 사용할 프로토콜을 지정한다. };
  • 15. TCP를 사용하고자 한다면?  주소 체계는 AF_INET  소켓 타입은 SOCK_STREAM  프로토콜은 IPPROTO_TCP 혹은 0도 가능하다.
  • 16. 소켓 닫기  소켓을 이용한 통신이 끝나면 관련 리소스를 반환해야 한다. int closesocket() { SOCKET s };
  • 17. 소켓 생성과 닫기 예제 코드 #include <stdio.h> #include <winsock2.h> int main(int argc, char * argv[]) { WSADATA wsa; // 윈속 초기화 if (0 != WSAStartup(MAKEWORD(2,2,), &wsa)) return -1; printf(“윈속 초기화 성공n”); // socket() SOCKET tcp_socket = socket(AF_INET, SOCK_STREAM, 0); if(tcp_sck == INVALID_SOCKET) printf(“소켓 생성 실패”); printf(“소켓 생성 성공”); // closesocket() closesocket(tcp_socket); WSACleanup(); return 0; }