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