Network Programming Autumn 2009 C Programming Related with Data Transfer and PDU Encapsulations
Contents Dynamic Memory Allocation (Review!) Bit Stream I/O Bit Operations in C Conversion of Little and Big Endian Codes PDU Encapsulation / Decoding
Static Memory Case 배열을사용하는경우에고려해야할문제점 / 단점파악 배열의크기로인해메모리할당에인위적인제한을가짐 실제저장하는요소의수가예상보다매우적으면메모리낭비발생 배열이담을수있는것보다더큰데이터를담아배열의경계를넘는경우프로그램은심각한문제에발생 배열의장점은프로그래밍이쉽다는점
Dynamic Memory : Needs 단점때문에프로그램실행시필요할때마다메모리를할당받는동적메모리할당의개념이필요 동적메모리할당이란프로그램실행시원하는크기의메모리를요청할수있고 더이상필요하지않다면즉시해제하여다른메모리요청에해제된메모리공간이다시사용될수있게함 대부분의경우이러한기억장소는컴퓨터에서모든기억장소를충분히이용하려는응용프로그램의요구충족 동적할당은링크드 ( 연결 ) 리스트와큐, 스택, 이진트리와같이자료구조를표현할때사용
Dynamic Memory: Allocation Scope 동적메모리할당시점 컴파일과정이아닌런타임 ( 실행시간 ) 에서이루어짐동적메모리할당은프로세스메모리영역중힙세그먼트 (Heap Segment) 에할당되며동적메모리는변수가아닌 포인터 변수를통해서만접근가능
Dynamic Memory : Library funtions in C <stdlib.h> void *malloc(size_t size); void *calloc(size_t num_elelments, size_t element_size); void *realloc(void *ptr, size_t size); void free(void *ptr); malloc() 함수 인수로크기 (byte 단위 ) 를넘겨주면운영체제에서는비어있는영역을할당하여그시작주소를반환 calloc() 함수 num_elelments * element_size 만큼의크기를할당하면서할당된공간을자동으로 0 으로초기화
Dynamic Memory : Library funtions in C realloc() 함수 이미할당되어있는영역을다시 size만큼재할당새로운영역의시작주소를반환이전내용은그대로보존되므로정보의손실은발생하지않음 free() 함수 인수는 malloc(), calloc(), realloc() 호출에서반환받은값반드시메모리주소함수는할당받은영역을해제 C 프로그램에서는일반적으로 malloc(), free() 함수를이용하여동적메모리를제어
malloc() char *ptr; ptr= (char *) malloc(80); ptr 40003100 0x 7f7f0100 스택세그먼트... (80 바이트 ) 0x 40003100 힙세그먼트... 데이터세그먼트...... 코드세그먼트
malloc() malloc() 함수앞의 (char *) 는 cast 연산자 만약 malloc() 함수가운영체제, 즉시스템으로부터메모리를할당받지못하면 ( 요청한만큼의메모리블록이없는경우 ) 이함수는 NULL 포인터를반환 일반적인형태 char *p; ptr= (char *) malloc(80); if(ptr==null) { printf( 메모리할당실패 \n ); exit(1); }. free(ptr) ; // 할당받은영역을해제
malloc() : Example 1 #include <stdio.h> #include <stdlib.h> int main(void) { char *ptr; if((ptr=(char *)malloc(80))==null) { printf("memory Allocation Error \n"); exit(1); } printf("name? "); gets(ptr); printf("%p %s \n", ptr, ptr); free(ptr); }
Dynamic Memory Example2 struct A {char name[20]; int age; } *ptr ; // 구조체포인터변수 printf( ptr 변수의크기 : %d \n, sizeof(ptr)); if((ptr=(struct A *)malloc(sizeof(struct A)))==NULL){ } printf("memory Allocation Error \n"); exit(1); printf("name? "); gets(ptr->name); printf("age? "); scanf("%d%*c", &ptr->age); printf(" 주소 : %p, %s %d \n",ptr, ptr->name, ptr->age); free(ptr); ptr 변수의크기 : 4 name? 홍길동 age? 25 주소 : 40003108, 홍길동 25
Stream I/O 스트림은실행중인프로그램과외부장치간의연결 (interface) 을해주는논리적인접속 파일입출력스트림은실행중인프로그램과외부장치를연결 (interface) 해주는논리적인접속 표준스트림은콘솔입출력을위한스트림으로운영체제에의해서자동으로생성되고관리되므로 C 개발자가표준스트림을위한연결과정을작성할필요없음 파일입출력스트림 ( 표준스트림이아닌모든것 ) 은운영체제에의해자동으로관리되지스트림을필요할때생성하고필요치않을때소멸해야함 스트림생성 파일을열어스트림과연결시키기위한파일에대해 fopen() 함수를호출하여해당스트림을연다. 스트림소멸 fclose() 함수를사용해서스트림을닫아준다.
Binary Stream I/O 2진 (binary) 스트림에서는어떤종류의데이터도사용될수있으며문자변환발생안함즉, 2진스트림에전달된내용과실제파일에저장된내용이항상동일함바이너리데이터는사람이읽을수없기때문에프로그램을통해읽혀지는데이터에만사용될수있음 이함수들은어떠한종류의표현을사용한어떠한형태의데이터라도읽고쓸수있음 이진파일은 text editor 에서데이터를확인할수없다. 바이너리데이터의이점은데이터를입출력시숫자값을문자열로변환하는데사용되는오버헤드와정밀도손실을피할수있다는점
Binary Stream I/O size_t fread ( void *buffer, size_t size, size_t num, FILE *stream); size_t fwrite ( void *buffer, size_t size, size_t num, FILE *stream); fread() 함수 stream과관련된파일에서 num개의개체를 ( 개체는 size 길이 ) buffer가가리키는버퍼로읽어들임실제읽은개체의수를반환하며이값이 NULL이아니라면파일의끝에도달했거나에러가발생한경우 fwrite() 함수 buufer가가리키는버퍼에서 num개의개체를 ( 개체는 size 길이 ) stream과관련된파일에 write 실체쓰여진개체의수를반환하며이값은출력에러가발생할경우에만 num보다작다
Binary Stream I/O : Example main() // item 정수형배열을이진파일로저장, 읽어본다 { FILE *fp; int item[10] = {1, 2, 3, 4, 5, 6, 7, 8, 9, 10 }; int i, t_item[10]={0}; if((fp=fopen("data4","wb"))==null) { exit(1); } for(i=0;i<10;i++) fwrite(&item[i], sizeof(item[i]), 1, fp); // 파일저장 fp=freopen("data4","rb",fp); for(i=0;i<10;i++) fread(&t_item[i], sizeof(t_item[i]), 1, fp); // 파일읽음 fclose(fp); } puts("t_item 배열 "); for(i=0;i<10;i++) printf("%5d",t_item[i]); printf("\n");
Random Access to File C 는파일의순차적 (sequentially) 접근뿐만아니라임의접근 (random access) 도지원 파일상에서읽거나쓰기작업을하기전에원하는위치를먼저찾으면임의접근이가능한데위치찾기작업을수행하려면다음의두가지함수가필요 int fseek( FILE *stream, long offset, int from); int ftell( FILE *stream);
Random Access to File int fseek( FILE *stream, long offset, int from); int ftell( FILE *stream); ftell() 함수 : 스트림에서현재위치를반환 fseek() 함수는다음에읽거나쓰기를수행할위치를변경 첫번째인수는현위치를바꿀스트림 offset은이동할거리 from은이동할기준위치 from은주어진매크로중에선택 from 인수 찾은결과 SEEK_SET 스트림의시작에서부터의 offset 바이트, offset 은음수가아니어야한다. SEEK_CUR 스트림의현재위치로부터 offset 바이트, offset 은양수나음수이다. SEEK_END 스트림의끝에서부터의 offset 바이트, offset 은주로음수이다.
Random Access to File Example main() { FILE *fp; int cur, location, i; int item[10] = {1, 2, 3, 4, 5, 6, 7, 8, 9, 10 }; if((fp=fopen("data6","wb"))==null){ exit(1); } fwrite(item, sizeof(item), 1, fp); // 파일저장 fp=freopen("data6","rb",fp); fseek(fp, 0, SEEK_SET); // fp 처음으로임의접근 location=ftell(fp); printf("loaction : %d \n", location); fread(&cur,sizeof(int),1,fp); // 첫번째데이터읽음 printf("curunt value : %d \n\n", cur);
Random Access to File fseek(fp, 0, SEEK_END); // fp 마지막으로임의접근 location=ftell(fp); printf("loaction : %d \n", location); fseek(fp, -4, SEEK_END); printf("loaction : %d \n", location); fread(&cur,sizeof(int),1,fp); // 마지막데이터읽음 printf("curunt value : %d \n\n", cur); // 마지막에서하나전으로임의접근 fseek(fp, 4*sizeof(int), SEEK_SET); // 처음부터다섯번째임의접근 location=ftell(fp); printf("loaction : %d \n", location); fread(&cur,sizeof(int),1,fp); // 다섯번째데이터읽음 printf("curunt value : %d \n", cur); } loaction : 0 curunt value : 1 loaction : 40 loaction :36 curunt value : 10 loaction : 16 curunt value : 5
Extra functions for File I/O int feof(file *stream); file 의 EOF 일경우 1 반환 int ferror(file *stream); file 의 EOF 발생시오류인지정상적인 EOF 인지확인함수, 오류인경우 1 반환 int remove(char const *filename); 지정된파일삭제 int rename(char const *oldname, char const *newname); 지정된파일이름변환 int fflush(file *stream); 대상파일의버퍼를비움스트림파일일경우디스크에기록 standard I/O 일경우입력버퍼를비움
Bit Field 구조체비트필드는멤버들의메모리할당을비트단위로할당 구조체에는메모리를효율적으로활용하기위해비트필드기능이제공 구조체비트필드선언형식 struct STRUCTURE_NAME { type member1 : bit_size; type member1 : bit_size;.... type member1 : bit_size; } structure_variable_name; 자료형은 int, char 형의 unsigned 를사용 멤버명옆에 : 과함께비트크기를지정
Bit Field struct BIT_F { unsigned char sexuality : 1; unsigned char married : 1; unsigned char dept : 4; } bit_info; // 성별 // 기혼, 미혼 // 부서코드 bit_info 구조체변수는다음과같이메모리에 1 바이트에서접근된다. married dept sex uality bit 1 bit 2 bit 3 bit 4 bit 5 bit 6 bit 7 bit 8 1 바이트
The bitwise operators of C Bitwise operator 사용예 Flag data 로사용할경우암호화프로그래밍 PDU Encoding/Decoding 그외? Data type 別표현되는값의범위를알아야함 signed/unsigned
The bitwise operators of C Logical Operations
The bitwise operators of C C 언어에서는비트단위의연산을위한 bitwise operator 제공 AND operation: & 특정비트의 Masking 에사용 OR operation: XOR operation: ^ NOT operation (Unary): ~ The shift operations: *, 보수, / 연산에사용가능 Left shift : << Right Shift : >> Operator ~ << >> >>> & ^ Precedence (H) (L)
Bitwise AND 10012 & 0011 2 = 0001 2 특정비트의 Masking 에사용 Bit OR 10012 0011 2 = 1011 2 Exclusive OR 10012 ^ 0011 2 = 1010 2 1 s Complement ~ 000010102 = 11110101 2
The bitwise operators of C: Shift operation
The bitwise operators of C Example short int s ; // assume that short int is 16 bit short unsigned u; s = 1; // s = 0xFFFF (2 s complement) u = 100; // u = 0x0064 u = u 0x0100; // u = 0x0164 s = s & 0xFFF0; // s = 0xFFF0 s = s ˆ u; // s = 0xFE94 u = u << 3; // u = 0x0B20 (logical shift ) s = s >> 2; // s = 0xFFA5 (arithmetic shift )
The bitwise operators of C Example
Print out format
Conversion of Little and Big Endian Codes 예 : 1025 (2^10 + 1) 4-byte integer에저장될경우 00000000 00000000 00000100 00000001 Base-Address Big-Endian Little-Endian + 01 00000000 00000001 + 02 00000000 00000100 + 03 00000100 00000000 + 04 00000001 00000000
Conversion of Little and Big Endian Codes Algorithm for conversion from Big to Little in case of 2 bytes integer unsigned char high,low; short littleend;... fp1=fopen(inputfile); fp2=fopen(outputfile); fread(&high, sizeof(char), 1, fp) while(!feof(fp)) {... } fread(&low, sizeof(char), 1, fp) littleend = (((unsigned)low<<8)&0xff00) high; fprintf(fp2, %d, littleend); Programming Work: 위알고리즘을기준으로 Big-Endian data file 을 Litle-Endian data file 로 conversion 하는프로그램작성
PDU Encapsulation <N> PCI <N> SDU <N> SDU <N> Layer <N> PCI <N> SDU <N> SDU <N-1> PCI <N> SDU <N-1> PCI <N- 1> Layer <N> SDU <N> SDU <N> SDU X PCI : Protocol Control Unit
PDU Encapsulation : Ethernet Frame 4 bytes Ethernet header (14 bytes) IP Header (20 bytes) TCP Header (24 bytes) Ethernet trailer (4 bytes) version 0x4 header length 0x6 destination address 00:e0:f9:23:a8:20 time-to;ive 0x80 option type 0x02 type 0x0800 header length Type of Service/TOS 0x5 0x00 Identification 0x9d08 protocol 0x06 cource IP address 128.143.137.144 destination IP address 128.143.71.21 total length (in bytes) 0x002c flags fragment offset 010 2 0000000000000 2 header checksum 0x8bff source port number 1627 10 destination port number 80 10 sequence number 0x0009465b acknowledgement number 0x00000000 unused flags window size 000000 2 000010 2 8192 10 TCP checksum 0x598e option length 0x04 CRC source address 0:a0:24:71:e4:44 urgent pointer 0x0000 maximum segment size 1460 10
PDU Encapsulation : Ethernet Header 6 b y t e s d e s t i n a t i o n a d d r e s s s o u r c e a d d r e s s t y p e 4 y b ts e C R C A p p l i c a t i o n d a t a E t h e r n e t H e a d e r I P H e a d e r T C P H e a d e r E t h e r n e t T r a i l e r E t h e r n e t f r a m e
PDU Encapsulation : Ethernet PCI 6 b y t e s 0 0 : e 0 : f 9 : 2 3 : a 8 : 2 0 0 : a 0 : 2 4 : 7 1 : e 4 : 4 4 0 x 0 8 0 0 4 y b ts e C R C A p p l i c a t i o n d a t a E t h e r n e t H e a d e r I P H e a d e r T C P H e a d e r E t h e r n e t T r a i l e r E t h e r n e t f r a m e
PDU Encapsulation : IP Header 32 bits version (4 bits) header length T TL Time-to-Live (8 bits) DS Identification (16 bits) Protocol (8 bits) ECN flags (3 bits) Total Length (in bytes) (16 bits) Fragment Offset (13 bits) Header Checksum (16 bits) Source IP address (32 bits) Destination IP address (32 bits) I P H e a d e r A p p l i c a t i o n d a t a E t h e r n e t H e a d e r T C P H e a d e r E t h e r n e t T r a i l e r E t h e r n e t f r a m e
PDU Encapsulation : IP PCI 32 bits 0x4 0x5 0x0 0x0 44 10 9d08 010 2 0000000000000 2 128 10 0x06 8bff 128.143.137.144 128.143.71.21 I P H e a d e r A p p l i c a t i o n d a t a E t h e r n e t H e a d e r T C P H e a d e r E t h e r n e t T r a i l e r E t h e r n e t f r a m e
PDU Encapsulation : TCP Header 32 b its S o urce P ort Nu m b er Des tin a tion P o rt Nu m ber S equ en c e n u m b er (32 b its ) A c k n o wled g em en t n u m b er (32 b its ) hea der length 0 Fla g s T C P c h ec k s u m option type length win d o w s iz e u rg en t p o in ter Ma x. segment siz e Option: maximum segment size A p p l i c a t i o n d a t a E t h e r n e t H e a d e r E t h e r n e t T r a i l e r I P H e a d e r T C P H e a d e r E t h e r n e t f r a m e
PDU Encapsulation : TCP PCI 32 b its 1627 10 80 10 607835 10 0 10 819210 6 10 000000 2 000010 2 0x598e 0000 2 2 10 4 10 1460 10 A p p l i c a t i o n d a t a E t h e r n e t H e a d e r E t h e r n e t T r a i l e r I P H e a d e r T C P H e a d e r E t h e r n e t f r a m e