전체 글

· 개발/C
이번엔 HTTP를 통해 통신을 해보자. 도메인을 입력하면 적절한 메시지로 변환하여 서버에 쏴주고 그 대답을 듣는 내용이다. 추후엔 읽어들일때 buf length를 인식해 종말점을 계산해주는 기능을 추가하려 한다. 배운점 1. character pointer를 문자열로 바꾸는법 char *ip_char = "172.16.3.80"; char ip[IP_LEN]; for(int i = 0; i ip 구조체는 . 으로 접근해서 수정. 하지만 포인터는 . 으로 접근할수 없어서 만든것이 ->..
· 개발/C
char *str[16] = {"a", "b", "c", "d"}; char **ptr = str; ptr[4] = "e"; for (int i = 0; i < strlen(str) + 5; i++){ printf("string %d is %s\n", i, ptr[i]); } str 자체는 포인터 없이도 그 문자열의 시작을 가리킨다. *str 은 문자열의 개별적인 칸들 즉 0번째, 1번째, 2번째,, 칸을 가리킨다. 그래서 일련의 문자열을 선언하려면 이걸 써야한다. **str 은 문자열의 특정한 칸을 가리킨다. 그래서 특정 문자열을 선언하려면 이걸 써야한다.
· 개발/C
화살표의 의미 구조체를 포인터로 가져왔을 경우 . 대신 쓰는 것. #include typedef struct { int s_id; int age; } Student; int main(){ Student goorm; Student *ptr; ptr = &goorm; (*ptr).s_id = 1004; // (*ptr).age = 20; ptr->age = 20; printf("goorm 의 학번 : %d, 나이 : %d\n", goorm.s_id, goorm.age); } goorm이 바꾸고자하는 구조체. *ptr이 이걸 바꾸기 위한 손가락. 이때 손쉽게 바꾸는 것이 바로 -> 기호. struct hostent *he; struct in_addr **addr_list; struct in_addr addr;..
· CS
HTTP 구조 HTTP 헤더와 본문으로 구성되어 있다. HTTP 본문에는 실제로 통신과정에서 주고 받을 컨텐츠가 담겨져 있다. HTTP헤더는 HTTP메시지(요청/응답)와 본문에 대한 정보를 말해주고 있다. 이에 대해서 이해하는 것이 실제로 중요하다. 해당 메시지가 제공하는 기능에 대한 최소한의 정보가 정리된 요약본이라고 할 수 있기 때문이다. 헤더에 그 프로토콜에 불필요한 내용을 담으면 네트워크로 전송되는 데이터의 크기가 커져서 빠른 전송이 불가능하기 때문에 프로토콜을 설계할 때부터 꼭 필요한 내용만 담아야 하고, 모든 기능이 표현되어야 한다. 이에 대해 HTTP 헤더는 크게 세가지로 구성되어 있다. General Header 전송되는 컨텐츠에 대한 정보보다는, 요청/응답이 이루어지는 날짜 및 시간등에 ..
· CS
HTTP 란 HyperTest Transfer Protocol로 문서간에 링크를 전송하는 프로토콜. HTML, 텍스트, 이미지, 음성, 영상, JSON 등 모든 형태의 데이터가 전송이 가능. 서버간의 데이터 전송에도 거의다 이거 씀. HTTP/1.1, HTTP/2 는 TCP를 기반으로 하고 있다. 하이퍼텍스트란 참조(하이퍼링크)를 통해 독자가 한 문서에서 다른 문서로 즉시 접근할 수 있게 하는 텍스트 HTTPS HyperTest Transfer Protocol SSL(Secure Socket Layer) HTTPS 는 HTTP에서 보안이 강화된 친구. HTTPS간에 전송되는 데이터는 추가적인 보안 계층이 존재. (TLS, 전송 보안 계층 프로토콜) 특징 클라이언트 서버구조 - request, respon..
· 개발/C
지금 하는건 C언어를 사용해서 fgets 로 buf 크기를 제한한 환경에서 HTTP stream 을 처리하는 일을 해보고 있다. 왜하냐? 싶지만 우리가 편하게 쓰는 java, python 의 response, request 객체 안에서 어떤 일이 벌어지는지 캐시, 커널이 얼마나 감사한 존재인지를 알기 위해서 진행해보려고 한다. buf를 재설정하기 memset(buf, 0, BUF_LEN); 이런식으로 아무때나 밀어도 되고 char buf[BUF_LEN] = {0,}; 설정할때 밀어도 된다 for (int i = recv_len; i < BUF_LEN; i++) { buf[i] = '\0'; } 아니면 원하는 조건대로 밀어도 된다. fgets 상황에서 buffer flush 하기 while(getchar(..
· 개발/C
형식 지정자 C 프로그래밍 언어에서 형식 지정자는 읽거나 쓰는 데이터의 형식과 형식을 지정하기 위해 형식이 지정된 입력/출력 함수에 사용되는 특수 문자입니다. 이들은 printf(), scanf(), fprintf() 및 fscanf()와 같은 함수와 함께 사용됩니다. %d = int (정수) 정수 값을 읽거나 씁니다. %s = string (문자열) 문자열을 읽거나 씁니다. %c = char (문자) 단일 문자를 읽거나 씁니다. %f = float (실수, 0.1을 0.100000 으로 출력) 부동 소수점 값을 읽거나 씁니다. %g = float (실수, 0.1을 0.1로 출력) %e = 지수형 값을 읽거나 씁니다. %o = 8진수 값을 읽거나 씁니다. %x = 16진수 값을 읽거나 씁니다. %p = ..
· 개발/C
\n 처리. fgets은 \n까지 저장하는 친구이기 때문이다. 그래서 이를 처리해주고 넘어가야한다. int main (void){ char end[16]; fputs("메시지 입력 : ", stdout); fgets(end, 16, stdin); printf("%d\n", (int)strlen(end)); end[strlen(end)-1] = '\0'; printf("%d\n", (int)strlen(end)); printf("%d\n", strcmp(end, "123")); } Strcmp int strcmp(const char *s1, const char *s2); 두 문자열이 [완전히] 일치하는지 확인하는 함수. 아닌경우 틀린 코드끼리의 아스키값 차이를 반환한다. fget char *fgets(ch..
· 개발/C
미션 1. 실시간으로 받은 내용을 output 해보자 2. buffer 크기 이상으로 받은 내용을 output 해보자 (hint : 무조건 한번에 출력해야하는건 아니다. 나눠서 출력해도 무방) 1번은 굉장히 쉽다. 버퍼가 일을 잘해주기 때문에 그 이상의 입력값도 알아서 인식해서 뱉어준다. 그런데 어려운건 [str의 끝은 0이어야 한다]는 규칙을 지키며 깔끔하게 짜는게 어려웠다. 전체 코드는 다음과 같다. 6으로 제한을 걸어둔 상태로 그 이상도 깔끔하게 나오게 해보기 위해 노력해보았다. #include #include #include #include #include #include #include #include #include #define MSG_MAX 6 #define BUF_LEN 6 int mai..
· CS
아스키코드 아스키코드는 '한 문자'를 1byte 즉 7bit 에 담아내는 규칙이다. 아스키코드는 ASCII로 American Standard Code for Information Interchange 의 약자이다. 이를테면 53도 두 문자기에 0x35 0x32 로 표현이 된다. 문자를 나타내는 규칙에 아스키코드만 있는건 아니다. 이를테면 Base64는 6bit 를 한문자에 담아낸 규칙이고, bytetohex는 4bit 를 한 문자에 담아내는 규칙이다. 아래에서 설명할 확장아스키코드는 한 문자를 8bit 에 담아내는 규칙이고, unicode 는 2byte 즉 16bit 를 한 문자에 담아내는 규칙이다. C/C++에서 char 가 1byte(8bit) 인 것으로 기억하면 된다. c언어는 언어의 특성상 메모리..
· 개발/C
scanf() %s 는 스페이스를 끝으로 인식해 그 다음 0을 넣어 문자열을 종결시킨다. stdin/stdout을 거쳐 동작. char str[16]; printf("msg : %s", str); scanf("result is %s", str); //scanf("%[^;]s", str); 이러면 끝을 ;로 인식 fgets() 스페이스를 극복하기 위해 나왔다. stdout/stdin buffer flow로 배열포인터에 size-1개씩 \n까지 포함해 저장한다. fputs("메시지를 입력하세요 : ", stdout); fgets(message, 512, stdin); fscanf()/fprintf() file buffer로 동작 sscanf()/sprintf() string buffer로 동작. https:..
· CS
허브 여러 컴퓨터를 연결해 네트워크를 만들어주는 장치로 데이터패킷 수령시 연결된 모든 장치에게 보내는 장치 허브의 단점 단순 분배 중계기로 IP할당 불가. 연결된 모든 장치에 패킷을 뿌리기에 데이터 전송 대역 분리해야함. 허브에 연결된 네트워크에서 하나의 디바이스에서 전송된 데이터프레임을 허브로 연결된 모든 디바이스에게 모두 전송하는 플러딩 즉 충돌이 많아짐. 보안이 안좋아 요즘 잘 안씀. 허브의 종류 L1더미허브 멀티포트 리피터 전기적 신호를 증폭시켜 들어온 데이터 재전송. LAN 최대 전송길이 연장, 접속 가능 창비 많아짐. 스위치 연결된 장치들의 IP, MAC주소 테이블을 갖고 원하는 목적지에 데이터패킷을 전송하는 장치. 라우터가 Internet 에서 길을 찾아 준다면 스위치는 LAN 에서 길을 찾..
yeonlee
이연