일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | |||
5 | 6 | 7 | 8 | 9 | 10 | 11 |
12 | 13 | 14 | 15 | 16 | 17 | 18 |
19 | 20 | 21 | 22 | 23 | 24 | 25 |
26 | 27 | 28 | 29 | 30 | 31 |
- 프로그래머스 레벨 2
- 백준
- HTTP 완벽 가이드
- 프로그래머스
- typescript
- dp
- BFS
- 알고리즘
- 타입 챌린지
- 자바스크립트
- Nestjs
- 쉬운 문제
- TCP
- Node.js
- socket
- ip
- 소켓
- type challenge
- dfs
- 문자열
- Algorithm
- javascript
- 수학
- 타입스크립트
- 크롤링
- 가천대
- HTTP
- 그래프
- Crawling
- 레벨 1
- Today
- Total
kakasoo
[TCP/IP] 주소정보의 표현 (자료형, 매크로 상수들이 있는 이유) 본문
주소정보의 표현
1
2
3
4
5
6
7
8
9
10
|
struct in_addr{
in_addr_t s_addr; // 32bit IPv4 인터넷
};
struct sockaddr_in{
sa_family_t sin_family; // 주소체계(address Family)
uint16_t sin_port; // 16비트 TCP/UDP PORT 번호
struct in_addr sin_addr; // 32bit IP 주소
char sin_zero[8] // 사용되지 않음
};
|
cs |
어떤 주소 체계를 사용하는가 -> IPv4
IP 주소는 무엇인가 -> xxx.xxx.xxx.xxx (자신의 IP, 또는 연결하고자 하는 IP를 말해야 한다.)
포트 번호는 무엇인가 -> 9180 (임의의 값을 말해주면 된다.)
이 질문에 모두 답했다면 소켓 간의 통신이 가능해졌다고 볼 수 있다, 이제 소켓에 정보를 담아야 하는데,
우리가 앞서 servScok과 ClientSocket에 담았던 정보들도 여기 있는 것들이다. (서버 소켓과 클라이언트 소켓)
sin_family는 sa_family_t의 자료형을 가진 변수로, IPv4, IPv6 따위의 주소 체계를 넣어야만 한다.
미리 만들어진 상수 AF_INET를 넣어주면 자동적으로 IPv4가 된다.
sin_port에는 포트의 번호를,
sin_addr에는 32비트 정수 자료형으로, IP 주소를, 마지막 sin_zero는 반드시 0으로 채워야 하는 변수이다.
(sockaddr_in의 구조체 크기를 sockaddr와 맞추기 위해서 일부러 만들어 놓은 것이다.)
(원래는 sockaddr를 사용했는데, 이 당시에는 하나의 배열에 IP와 포트 번호를 모두 입력해야 했다)
(그리고 남은 자리를 0으로 채워 넣어야 했던 불편함이 있었는데, 이 둘을 분리하는 과정에서 sin_zero[]가 생겼다.)
전부 처음 보는 자료형과, 많은 매크로 상수들이 존재하는데, 이들은 모두 확장성을 고려하여 만들어진 것들이다.
무시하고 싶다면, 사실 무시해도 된다. (내 생각에는, 이게 바뀔 날이 올 때쯤에는 이미 다시 공부해야 한다.)
만약 우리가 사용하고 있는 자료형들의 개념, 정의가 바뀐다고 하더라도 그대로 유지할 수 있도록,
자료형을 socket programming에 맞춰서 전부 재정의해놓은 것들이기 때문이다.
'프로그래밍 > 네트워크' 카테고리의 다른 글
[TCP/IP] 인터넷 주소의 초기화와 할당 (window) (0) | 2020.07.15 |
---|---|
[TCP/IP] htons, htonl의 윈도우 기반 사용 예 (0) | 2020.07.15 |
[TCP/IP] 소켓에 할당되는 IP 주소와 PORT 번호? (0) | 2020.07.15 |
[TCP/IP] 윈도우 소켓 간 통신 (cmd 창에서 확인하기) (0) | 2020.07.15 |
[TCP/IP] 소켓의 프로토콜과 그에 따른 데이터 전송 특징 (0) | 2020.07.14 |