chapter 3 socket introduction
DESCRIPTION
Chapter 3 Socket Introduction. abstract. Socket Address Structure Value-Result Argument Byte Ordering Function Byte Manipulation Function 기타 중요 함수. Socket Address Structure. Socket = IP address + TCP or UDP port number Used in a socket function as a argument (as pointer). - PowerPoint PPT PresentationTRANSCRIPT
Socket Introduction 1
Chapter 3 Socket Introduction
abstract
• Socket Address Structure• Value-Result Argument• Byte Ordering Function• Byte Manipulation Function• 기타 중요 함수
Socket Address Structure
• Socket = IP address + TCP or UDP port number
• Used in a socket function as a argument (as pointer).
• IP address, TCP or UDP port number, length of structure .....
• Each protocol define its own Socket Address Structure(IPv4, IPv6....)
IPv4 Socket Address Structure
Struct in_addr{ in_addr_t s_addr; /*32bit IPv4 address*/ }; /*network byte ordered*/
struct sockaddr_in { uint8_t sin_len; /* length of structure(16) */ sa_family_t sin_family; /* AF_INET */ in_port_t sin_port; /* 16bit TCP or UDP port number */ /*network byte ordered*/ struct in_addr sin_addr; /* 32bit IPv4 address */ /*network byte ordered*/ char sin_zero[8]; /* unused */ }; /* included in <netinet/in.h> */
Datatypes required by Posix.1gDatatype Description Headerint8_tuint8_tint16_tuint16_tint32_tuint32_t
Signed 8bit integerUnsigned 8bit integerSigned 16bit integerUnsigned 16bit integerSigned 32bit integerUnsigned 32bit integer
<sys/types.h><sys/types.h><sys/types.h><sys/types.h><sys/types.h><sys/types.h>
Sa_family_t
Socklen_t
Address family of socket addressstructureLength od socket address structurenormally uint32_t
<sys/socket.h>
<sys/socket.h>
In_addr_tIn_port_t
Ipv4 address, normally uint32_tTCP or UDP port, normally uint16_t
<netinet/in.h><netinet/in.h>
Generic Socket address structure• Socket address structure 는 함수에서 포인터 인자로서 사
용 . 따라서 이기종 protocol 의 고유 structure 를 handling 하기위해서 사용
• ANSI C : void*• <sys/socket.h> : Generic Socket address structure struct sockaddr { uint8_t sa_len; sa_family_t sa_family; /*address family: AF_xxx value*/ char sa_data[14]; /*protocol specific address*/ }
• int bind(int , struct sockaddr * , socklen_t);• (example) struct sockaddr_in serv; /*IPv4 socket address structure*/ /* fill in serv{} */ bind(sockfd, (struct sockaddr *) &serv, sizeof(serv));
• 즉 이기종 protocol 의 structure 를 핸들링하기위한 일반 structure 포인터 (type casting 주의 )
Generic Socket address structure 사용예
IPv6 Socket Address StructureStruct in6_addr{ uint8_t s6_addr[16]; /*128bit IPv6 address*/ }; /*network byte ordered*/#define SIN6_LEN /* required for compile-time tests */struct sockaddr_in6 { uint8_t sin6_len; /* length of structure(24) */ sa_family_t sin6_family; /* AF_INET6*/ in_port_t sin6_port; /* Transport layer port# */ /*network byte ordered*/ uint32_t sin6_flowinfo; /* priority & flow label */ /*network byte ordered*/ struct in6_addr sin6_addr; /* IPv6 address */ /*network byte ordered*/}; /* included in <netinet/in.h> */
Comparison of socket address structure
IPv4 Header
IPv6 Header
IPv4Address
IPv6Address
Value-Result Argument
• socket address structure 는 socket function들에 인자로 넘겨질때 , 항상 포인터로 넘겨진다 .( passed by reference.)
• socket address structure 가 process 에서 kernel 로 가는지 그 역인지에 따라 방법이다름
Socket address structure pass.
Bind, connect, sendto Accept, recvfrom, getsockname,getpeername
• Process to kernelstruct sockaddr_in serv/* fill in serv{} */connect(sockfd, (SA *)&ser
v, sizeof(serv));
• Kernel to processstruct sockaddr_un cli/* unix domain */
socklen_t len;len = sizeof(cli);getpeername(unixfd, (SA*)&cli,&len);/* len 값은 변할수 있다 . */
Byte Ordering Function
High-order byte low-order byte
MSB 16bit value LSB
High-order byte low-order byte
Increasing memory
address
Address A+1 Address ALittle-endian byte order:
big-endian byte order:
Address A+1Address AIncreasing memory
address
Figure3.9 determine host byte order#include "unp.h"int main(int argc, char **argv){
union {short s; char c[sizeof(short)]; } un;
un.s = 0x0102;printf("%s: ", CPU_VENDOR_OS);if (sizeof(short) == 2) {if (un.c[0] == 1 && un.c[1] == 2) printf("big-endian\n");
else if (un.c[0] == 2 && un.c[1] == 1) printf("little-endian\n"); else printf("unknown\n");
} else printf("sizeof(short) = %d\n", sizeof(short)); exit(0);}
•network program 시 항상 byte ordering 에 유의해야함•Internet protocol 은 big-endian byte 를 사용 (i384 계열은 little-endian byte)•즉 host byte order 와 network byte order 간의 byte order 가 다르면 conversion 필요
•#include<netinet/in.h>uint16_t htons (uint16_t host16bitvalue);uint32_t htonl (uint32_t host32bitvalue);
uint16_t ntohs (uint16_t net16bitvalue);uint32_t ntohl (uint32_t net32bitvalue);
h:host n:network s:short(16bit) l:long(32bit)@host byte order 와 network byte order 가 같은 시스템에서 위함수들은 null macro 로 정의되있음
Return : value in network byte order
Return : value in host byte order
Byte Manipulation Function• #include <strings.h> void bzero(void *dest, size_t nbytes); /* dest 의 nbyte 만큼을 0 으로 만듬 : socket address structure 를
0 으로 초기화 할때 사용 */ void bcopy(const void *src, void *dest, size_t nbytes); /* src 로 부터 nbytes 만큼을 dest 로 copy */ int bcmp(const void *ptr1, const void *ptr2, size_t nbytes); /* return 0 if equal, nonzero if unequal */
• #include <string.h>void *memset(void *dest, int c, size_t len);/* dest 에서 len 만큼의 byte 를 변수 c 의 값으로 설정 */
void *memcpy(void *dest, const void *src, size_t nbytes);/* src 의 nbytes 만큼을 dest 로 copy */int memcmp(const void *ptr1, const void *ptr2, size_t nbytes);/* ptr1 < ptr2 : less than 0 ptr1 > ptr2 : greater than 0 ptr1 = ptr2 : than 0 */
inet_aton,inet_addr, inet_ntoa function
• Convert internet address between ASCII string and network byte ordered binary values(socket address structure 에 저장되 있음 ) ==> 예 )”203.255.74.129”
• IPv4 address 만을 convert• IPv6 용 : inet_pton , inet_ntop
• #include<arpa/inet.h> int inet_aton(const char *strptr, struct in_addr *addrptr); /* return : 1 if string was valid,0 on error */
in_addr_t inet_addr(const char *strptr); /* return : 32bit binary network byte ordered IPv4 address; INADDR_NONE if error */ char *inet_ntoa(struct in_addr inaddr); /*return pointer to dotted-deci
mal string*/
inet_pton,inet_ntop function• IPv4,IPv6 모두에 대해 address converting• p : presentation(string) n : numeric(binary)
• #include<arpa/inet.h> int inet_pton(int family, const char *strptr, void *addrptr); /* return: 1 if OK, 0 if input not a valid presentation format, -1 onerror */ /* string 을 binary 값으로 */
const char *inet_ntop(int family, const void *addrptr, char *strpt, size_t len); /* return : pointer to result if OK, NULL onerror */ /* len : size of the destination */ /* binary 값을 string 값으로 */
#include “unp.h”
ssize_t readn(int filedes, void *buff, size_t nbytes);
ssize_t writen(int filedes, const void *buff, size_t nbytes);
ssize_t readline(int filedes, void *buff, size_t maxline);
All return: number of bytes read or written, -1 on error
Isfdtype function• Test a Descriptor to see if it is of a specified type• historically : fstat function used ==> testing the returned value st_mode value using one of
the S_ISxxx macro.
#include <sys/stat.h>int isfdtype(int fd, int fdtype); /* return:1 if descriptor of specified type, 0 if not, -1 on error */ /* To test for a socket, fdtype is S_IFSOCK.*/
• #include “unp.h” #ifndef S_IFSOCK #error S_IFSOCK not defined #endif int isfdtype(int fd, int fdtype) { struct stat buf; if(fstat (fd, &buf) < 0) return (-1); if((buf.st_mode & S_IFMT) == fdtype) return (1); else return (0); }