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;
}

Winsock

  • 1.
  • 2.
    winsock  Windows SocketAPI의 줄임말로, 윈도 운영체제 기반의 네트워크 프로그램을 개발하기 위한 기술 요소들이 적용된 개발 도구  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  인터넷 상에서물리적으로 떨어져있는 소프트웨어와 소프트웨어 간의 통신을 담당하는 „소프트웨어 통신 도구„  인터넷의 종단에 위치하면서 소프트웨어와 소프트웨어를 연결한다.
  • 8.
  • 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; }