본문 바로가기

Layer7

C socket

Socket?

네트워크상에서 동작하는 프로그램 간 통신의 종착점, 프로그램이 네트워크에서 데이터 통신을 할 수 있도록 연결해 주는 연결부.

Socket, http 차이점

http Socket
단방향 통신 (Client -> Server) 양방향 통신 (Client <--> Server)
서버로 접근할 때 용이함 실시간 통신에 용이함
자원을 적게 소모함 자원을 많이 소모함

 

소켓통신 과정


test_clnt 파일의 코드를 살펴보면 다음과 같다.

#include<stdio.h> #include<stdlib.h> #include<string.h> #include<unistd.h> #include<arpa/inet.h> #include<sys/socket.h> #define BUFSIZE 50 // #0 void err_handling(char *msg) { perror(msg); exit(1); } int main(int argc, char *argv[]) { int serv_sock; struct sockaddr_in serv_addr; int client_len; // #1 serv_sock = socket(PF_INET, SOCK_STREAM, 0); if(serv_sock<0) err_handling("socket err"); // #2 memset(&serv_addr, 0, sizeof(serv_addr)); serv_addr.sin_family = AF_INET; serv_addr.sin_addr.s_addr = inet_addr(argv[1]); serv_addr.sin_port = htons(atoi(argv[2])); if (connect(serv_sock, (struct sockaddr *)&serv_addr, sizeof(serv_addr)) < 0) err_handling("connect err"); // #3 char buf[BUFSIZE] = {0,}; read(0, buf, BUFSIZE); // 0번째 fd 는 표준입력 디스크립터 write(serv_sock, buf, BUFSIZE); memset(buf, 0, BUFSIZE); read(serv_sock, buf, BUFSIZE); write(1, buf, BUFSIZE); // 1번째 fd 는 표줄출력 디스크립터 // #4 close(serv_sock); return 0; }

#0 error_handling( ) :에러 처리

void err_handling(char *msg) { perror(msg); exit(1); }

헤더에 정의 되어 있는 함수는 아님
perror( ) : 인자로 들어온 메시지를 출력하고 표준 에러를 출력함
exit(1) : 보통 1로 종료 -> 에러로 종료함


#1 socket 생성

serv_sock = socket(PF_INET, SOCK_STREAM, 0); if(serv_sock<0) err_handling("socket err");

PF_INET : IPv4 사용
SOCK_STREAM : TCP 사용
0 : type에서 정한 프로토콜 사용
반환 값 - 성공시 socket_fd, 실패시 0


#2 server socket과 client socket 연결

 memset(&serv_addr, 0, sizeof(serv_addr)); serv_addr.sin_family = AF_INET; serv_addr.sin_addr.s_addr = inet_addr(argv[1]); serv_addr.sin_port = htons(atoi(argv[2])); if (connect(serv_sock, (struct sockaddr *)&serv_addr, sizeof(serv_addr)) < 0) err_handling("connect err");

struct sockaddr : 서버 관련 구조체
serv_addr.sin_family : 사용할 주소 체계
serv_addr.sin_addr.s_addr : 연결할 ip 주소
serv_addr.sin_port : 연결할 포트
inet_addr : 문자열로된 ip 주소를 해석
atoi : str to int
htons : 인자를 네트워크에서 사용하는 프로토콜에 맞춰서 재조합(바이트 오더 비꿈)


#3

#define BUFSIZE 50 char buf[BUFSIZE] = {0,}; read(0, buf, BUFSIZE); // 0번째 fd 는 표준입력 디스크립터 write(serv_sock, buf, BUFSIZE);

인자 1 : fd (파일 디스크립터)

  • 표준 입력(Standard Input) : 0
  • 표준 출력(Standard Output) : 1
  • 표준 에러(Standard Error) : 2

인자 2 : 입력, 기록 받을 버퍼의 주소
인자 3 : 입력, 기록할 데이터의 크기

#4 통신 끝

close(serv_sock);

'Layer7' 카테고리의 다른 글

HackCTF : basic_BOF #1  (0) 2021.06.16
Socket misc  (0) 2021.06.13
ELF file  (0) 2021.06.02
코드 분석 하기  (0) 2021.05.30
코드 분석하기  (0) 2021.05.26