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 |