HyeM

네트워크 함수정리 본문

Study

네트워크 함수정리

Hailey_HyeM207 2020. 3. 11. 19:01

 

구조체 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;
};
Comments