chapter 3 socket introduction

28
Socket Introduction 1 Chapter 3 Socket Introduction

Upload: allayna

Post on 13-Feb-2016

24 views

Category:

Documents


0 download

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 Presentation

TRANSCRIPT

Page 1: Chapter 3  Socket Introduction

Socket Introduction 1

Chapter 3 Socket Introduction

Page 2: Chapter 3  Socket Introduction

abstract

• Socket Address Structure• Value-Result Argument• Byte Ordering Function• Byte Manipulation Function• 기타 중요 함수

Page 3: Chapter 3  Socket Introduction

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....)

Page 4: Chapter 3  Socket Introduction

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> */

Page 5: Chapter 3  Socket Introduction

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>

Page 6: Chapter 3  Socket Introduction

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*/ }

Page 7: Chapter 3  Socket Introduction

• 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 사용예

Page 8: Chapter 3  Socket Introduction

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> */

Page 9: Chapter 3  Socket Introduction

Comparison of socket address structure

Page 10: Chapter 3  Socket Introduction

IPv4 Header

Page 11: Chapter 3  Socket Introduction

IPv6 Header

Page 12: Chapter 3  Socket Introduction

IPv4Address

Page 13: Chapter 3  Socket Introduction

IPv6Address

Page 14: Chapter 3  Socket Introduction

Value-Result Argument

• socket address structure 는 socket function들에 인자로 넘겨질때 , 항상 포인터로 넘겨진다 .( passed by reference.)

• socket address structure 가 process 에서 kernel 로 가는지 그 역인지에 따라 방법이다름

Page 15: Chapter 3  Socket Introduction

Socket address structure pass.

Bind, connect, sendto Accept, recvfrom, getsockname,getpeername

Page 16: Chapter 3  Socket Introduction

• 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 값은 변할수 있다 . */

Page 17: Chapter 3  Socket Introduction

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

Page 18: Chapter 3  Socket Introduction

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);}

Page 19: Chapter 3  Socket Introduction

•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

Page 20: Chapter 3  Socket Introduction

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 */

Page 21: Chapter 3  Socket Introduction

• #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 */

Page 22: Chapter 3  Socket Introduction

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

Page 23: Chapter 3  Socket Introduction

• #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*/

Page 24: Chapter 3  Socket Introduction

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 값으로 */

Page 25: Chapter 3  Socket Introduction
Page 26: Chapter 3  Socket Introduction

#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

Page 27: Chapter 3  Socket Introduction

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.*/

Page 28: Chapter 3  Socket Introduction

• #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); }