일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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 |
- 컴퓨터구조
- leetcode 344
- 올바른 변수명 짓기
- 빅데이터를 지탱하는 기술
- 배열
- leetcode 819
- leetcode 15
- leetcode 121
- 데이터레이크와 데이터웨어하우스
- Python
- wargame.kr
- airflow docker
- Hadoop
- leetcode 561
- 블로그 이전했어요
- webcrawler
- leetcode 238
- docker로 airflow 설치하기
- 스파크 완벽 가이드
- leetcode 937
- leetcode 5
- leetcode 234
- MapReduce 실습
- 문자열 조작
- leetcode125
- Hortonworks Sandbox
- 머신러닝
- ctf-d
- leetcode 49
- leetcode
- Today
- Total
HyeM
네트워크 함수정리 본문
구조체 SOCKADDR_IN : 주소 정보 담기
struct SOCKADDR_IN { //소켓에 저장될 주소 정보
sa_family_t sin_family; //주소체계
uint16_t sin_port; //TCP/UDP port번호
struct in_addr sin_addr; // 32비트 IPv4주소
char sin_zero[8]; //패딩으로 사용
};
struct in_addr{
Unit32_t s_addr; //32비트 IPv4주소
};
▷ Sin_family : 프로코콜마다 적용하는 주소체계가 다름
주소체계( Address Family) | 의미 |
AF_INET | IPv4 인터넷 프로토콜에 적용하는 주소체계 |
AF_INET6 | IPv6 인터넷 프로토콜에 적용하는 주소체계 |
AF_LOCAL | 로컬 통신을 위한 유닉스 프로토콜의 주소체계 |
▷ Sin_port : 16비트 port번호 저장. ‘네트워크바이트순서’(빅엔디안)로 저장
▷ Sin_addr : 32비트 IP주소를 저장. ‘네트워크바이트순서’(빅엔디안)로 저장
구조체 in_addr(32비트 정수자료형)로 정의됨
▷Sin_zero : 패딩
구조체 hostent : DNS 서버에 조회하여 IP주소 또는 도메인 주소를 찾고나서 반환할때 이용됨
struct hostent {
char *h_name; //공식 도메인 이름
char **h_aliases; //공식도메인 이외 도메인 이름들
int h_addrtype; //주소정보 체계(IPv4: AF_INET, IPv6: AF_INET6)
int h_length; //IP주소의 크기(4Bytes)
char **h_addr_list; //바이트 정렬된 IP주소
//도메인 이름에 대한 IP주소가 정수 형태로 반환될 때 이용됨
};
inet_addr 함수 : ip문자열을 네트워크 바이트 순서의 binary주소로 반환
#include <arpa/inet.h>
in_addr_t inet_addr(const char *cp);
▷ return 값 : -1일땐 오류를 나타냄. 그외는 정상적인 binary주소
- 구조체 sockaddr_in 에서 맴버변수 sin.sin_addr을 바꾸는데 사용된다.
setsockopt 함수 : 생성한 socket속성바꾸는 함수
#include <sys/socket.h>
int setsockopt(int sockfd, int level, int optname, const void *optval, socklen_t optlen);
▷int sockfd : 소켓 디스크립터
▷int level : optname 값을 설정하는 값; 옵션종류
- SOL_SOCKET : optname은 socket level에서 설정하는 option명
- IPPROTO_IP : optname은 IP protocol level에서 설정하는 option명
- IPPROTO_TCP : optname은 TCP protocol level에서 설정하는 option명
▷int optname : 구체적인 옵션 이름; 설정을 위한 소켓 옵션번호;level에 따라 그 종류가 달라짐.
자세한건 https://dbehdrhs.tistory.com/83참고
▷const void *optaval : optname(설정값)을 저장할 주소
▷socklen_t optlen :optaval 크기
▶RETURN 값 : 0 이면 정상, -1 은 오류 발생
가변인자
▷va_list : 각 가변 인자의 시작 주소를 가리킬 포인터. 내부적으로 char* 로 정의됨.
▷va_start : va_list 로 만들어진 포인터에게 가변인자 중 첫번째 인자의 주소를 가르쳐 주는 매크로임.
#define va_start(ap, v) ( (ap) = (va_list)_ADDRESSOF(v) + _INTSIZEOF(v) )
/*
ap : va_list로 만든 포인터
v : 마지막 고정인수가 담긴다.
*/
//ADDRESSOF(v) : 주소로 바꿔줌
▷va_arg : 특정 가변 인자를 가리키고 있는 va_list의 포인터를 다음 가변인자로 이동시킬때 사용
#define va_arg(ap,t) ( *(t *)((ap += _INTSIZEOF(t)) - _INTSIZEOF(t)) )
/*
ap : va_list로 만든 포인터
t : int나 long, double 과 같은 타입이름이 담김
*/
▷va_end : 사용한 가변인자 변수를 끝낼 때 사용함. (NULL포인터로 return)
참고 : https://norux.me/19
구조체 iphdr
struct iphdr {
#if defined(__LITTLE_ENDIAN_BITFIELD)
uint8_t ihl :4,
version:4;
#elif defined (__BIG_ENDIAN_BITFIELD)
uint8_t version:4,
ihl :4;
#else
#error "Please fix <asm/byteorder.h>"
#endif
uint8_t tos;
uint16_t tot_len;
uint16_t id;
uint16_t frag_off;
uint8_t ttl;
uint8_t protocol;
uint16_t check;
int32_t saddr;
int32_t daddr;
};
구조체 tcphdr
struct tcphdr {
__u16 source;
__u16 dest;
__u32 seq;
__u32 ack_seq;
#if defined(__LITTLE_ENDIAN_BITFIELD)
__u16 res1:4,
doff:4,
fin:1,
syn:1,
rst:1,
psh:1,
ack:1,
urg:1,
ece:1,
cwr:1;
#elif defined(__BIG_ENDIAN_BITFIELD)
__u16 doff:4,
res1:4,
cwr:1,
ece:1,
urg:1,
ack:1,
psh:1,
rst:1,
syn:1,
fin:1;
#else
#error "Adjust your <asm/byteorder.h> defines"
#endif
__u16 window;
__u16 check;
__u16 urg_ptr;
};
'Study' 카테고리의 다른 글
[윈도우즈시스템프로그래밍]_1장 컴퓨터 구조와 프로그래밍 (0) | 2020.01.23 |
---|