소켓: 통신의 종단점 또는 종단점을 가리키는 OS 안의 자료구조
-> 파일 입출력에서 FILE에 해당한다.
소켓 라이브러리: 응용 프로그램이 네트워크 건너의 다른 프로그램과 통신할 때 사용하는 함수 모음이다. OS마다 약간 다르지만 큰 차이는 없다.
-> Visual C++에서 소켓 라이브러리를 이용하려면 프로젝트->속성->링커->입력->추가종속성->ws2_32.lib를 추가하거나,
#pragma comment(lib, "ws2_32.lib");
위의 코드를 추가하면 된다.
소켓 라이브러리 함수는 네트워크 프로그램에서만 사용하기 때문에 응용프로그램을 개발할 때 기본으로 링크되지 않아서 라이브러리를 추가하는 과정이 필요하다.
Windows에서 소켓 라이브러리를 사용하기 위해서는 WSAStartup()과 WSACleanup()을 호출해줘야 한다.
소켓 생성은 아래와 같이 할 수 있다.
SOCKET socket(
int af, //Address Family
int type,//소켓타입
int protocol //사용할 프로토콜
)
-> 다양한 통신이 방식이 있기 때문에 생성된 소켓이 어떤 방식으로 통신할지 지정해야 한다. 통신방식은 주로 네트워크 계층, 수송 계층 프로토콜에 의해 결정된다.
* 인터넷: 네트워크 계층 IP, 수송 계층 TCP 또는 UDP를 사용하는 네트워크
-> Address Family는 네트워크 계층 프로토콜이 IPv4임을 가리키며, AF_INET 으로 쓴다.(실제 값은 winsock2.h에 2로 정의되어 있다.)
-> 소켓타입
SOCK_STREAM: 데이터를 반드시 전달한다는 의미
SOCK_DGRAM: 가끔 데이터 전달에 실패한다는 의미
-> 사용할 프로토콜은 지정할 필요가 없기 때문에 0으로 쓰면 된다. 인터넷에는 STREAM 타입의 수송 계층 프로토콜이 TCP이고, DGRAM 타입의 수송 계층 프로토콜이 UDP 밖에 없기 때문이다.
소켓 소멸은 아래와 같이 사용하면 된다.
int closesocket(
SOCKET s //소켓 디스크립터
)
-> 소켓 디스크립터를 OS에 반납하고 연관된 자원도 반환하며, 상세한 동작은 소켓 옵션 설정에 따라서 달라진다.
<소켓 이름 붙이기>
- 파일에 이름이 있듯이, 소켓에도 이름이 존재한다. 이 소켓 이름은 개발자 마음대로 붙일 수가 없다. 인터넷에서는 IP address, port number 의 형태로 이름을 붙이게 된다. 소켓 라이브러리에는 이름 설정에 필요한 구조체도 정의되어 있기 때문에 따로 정의해주지 않아도 된다.
아래는 TCP 소켓에 이름을 붙인 후에 종료까지 한 코드이다.
#include <WinSock2.h>
#include <stdio.h>
#include <WS2tcpip.h>
int main() {
WSADATA wsa;
if (WSAStartup(MAKEWORD(2, 2), &wsa) != 0) { //WSAStartup=WindowsSocketAPI
//소켓라이브러리가 로딩이 됐는지 안 됐는지 확인
//0아닌 값이 넘어오면 로딩이 안 된 것이다.
printf("Error in starting up Winsock\n");
return -1;
}
SOCKET s = socket(AF_INET, SOCK_DGRAM, 0);
SOCKADDR_IN myAddress;
ZeroMemory(&myAddress, sizeof(myAddress));
myAddress.sin_family = AF_INET;
myAddress.sin_port = 50000;
inet_pton(AF_INET, "165.229.125.60", &(myAddress.sin_addr.s_addr));
bind(s, (SOCKADDR*)&myAddress, sizeof(myAddress));
closesocket(s);
WSACleanup();
return 0;
}
//프로젝트->속성->링커->입력->추가종속성->ws2_32.lib 추가
추가)
- Loopback address: 목적지 IP 주소 127.0.0.1 패킷을 보내면 인터넷으로 나가지 않고 자기자신에게 되돌아 온다.
- INADDR_ANY: 서버 소켓의 이름을 IP 주소로 명시하면 실행 컴퓨터가 달라질 때마다 소스코드를 수정하는 불편함이 발생하므로 서버 소켓의 IP 주소를 INADDR_ANY로 설정하면 실행 컴퓨터의 IP 주소로 자동 설정이 된다.
- 클라이언트와 서버 프로그램을 동일 컴퓨터에서 테스트할 때의 서버는 INADDR_ANY, 클라이언트는 목적지(서버) 주소 127.0.0.1 로 설정하면 편리하다.
'네트워크' 카테고리의 다른 글
3. UDP 소켓 함수 (0) | 2021.09.28 |
---|
댓글