본문 바로가기

공부/LinuxServer

(8)

[Linux Server] Node.js로 TCP 에코 서버 구현하기 (+ 방화벽 설정, 포트 열기) 원격 서버는 AWS lightsail을 이용해서 구현하였습니다. OS는 cent os 입니다. 목차 1. Node.js 설치 1-1. epel 설치 1-2. node.js 설치 2. 포트 열기 2-1. 리눅스 포트 열기 2-2. AWS 포트 허용 3. 서버 코드 작성 4. 클라이언트 코드 작성 5. 서버 설정 1. Node.js 설치 1-1. epel 설치 1-1-1. epel 설치 확인 yum repolist 또는 yum repolist | grep epel yum 명령어를 통해 epel 저장소가 있는지 확인한다. (빨간줄로 표시된 부분이 있어야 설치된 상태) 없을 경우 epel 설치를 진행한다. 1-1-2. epel 설치 sudo yum -y install epel-release epel을 설치한다...
6. 정보를 주고 받기 - send(), recv() 1. header #include #include 2. function int send(int socket, const void *msg, size_t len, int flags); int recv(int socket, void *buf, size_t len, int flags); 1) int socket: 통신의 주체가 되는 소켓 디스크립터 send - 정보를 받을 소켓 디스크립터 주소 recv - 정보를 보내는 소켓 디스크립터 주소 2) const void *msg : 상대에게 보낼 자료의 포인터 3) void *buf : 받은 메세지를 저장할 버퍼 포인터 4) size_t len : 전송되는 메세지의 크기 (byte 단위) 5) int flags : 플레그(옵션) flags 설명 MSG_DONTWA..
5. 클라이언트의 접속 요청을 허락하고 통신용 소켓 생성 - accept() 1. header #include 2. function int accept(int socket, struct sockaddr *addr, socklen_t *addrlen); 1) int socket : listen()으로 클라이언트의 접속요청을 받고있는 소켓 2) struct sockaddr *addr : 클라이언트 주소정보를 가지고 있는 sockaddr 구조체 포인터 3) socketlen_t *addrlen : addr 포인터가 가르키는 구조체의 크기 4) return : 성공 실패 클라이언트와의 통신 소켓 디스크립터 -1 3. 사용 #include #include #include #include #include #define PORT 80 int main() { int sock = socket(A..
4. 클라이언트에서 서버에 연결 요청하기 - connect() 1. header #include 2. function int connect(int socket, const struct sockaddr *server_address, socklen_t addrlen); 1) int socket : 서버와 연결할 소켓 2) struct sockaddr *server_address : 서버의 주소를 가지고 있는 sockaddr 구조체의 포인터 3) socklen_t addrlen : server_address 포인터가 가르키는 구조체의 크기 4) return : 성공 실패 0 -1 3. 사용 #include #include #include #include #include int main() { const int port = 80; int sock = socket(AF_IN..
3. 클라이언트의 접속요청 확인하기 - listen() 1. header #include 2. function int listen(int socket, int backlog); 1) int socket : 클라이언트의 접속요청을 받도록 설정 할 소켓 디스크립터. 2) int backlog : 대기 메시지 큐의 개수 3) return : 성공 실패 0 -1 3. 사용 #include #include #include #include #include #define PORT 80 int main() { int sock = socket(AF_INET, SOCK_STREAM, 0); struct sockaddr_in addr; socklen_t len = sizeof(addr); addr.sin_family = AF_INET; addr.sin_port = htons(P..
2. 소켓에 정보 지정하기 - bind() 1. header #include 2. function int bind(int socketfd, struct sockaddr* address, socklen_t addressLength); 1) int socket : socket()등으로 생성한 소켓 디스크립터. 2) struct sockaddr* address : 주소 정보를 담은 구조체. 통신 주체에 따라서 달라집니다. struct 내용 sockaddr 기본 구조체. sockaddr_in AF_INET인 경우. (IPv4) sockaddr_in6 AF_INET6인 경우. (IPv6) sockaddr_un AF_UNIX 또는 AF_LOCAL인 경우. (Unix Domain Socket) 3) socklen_t addressLength : address..
1. 소켓 만들기 - socket() 1. header #include 2. function int socket(int domain, int type, int protocol); 1) int domain : 통신의 주체를 결정합니다. 아래는 상수값으로, socket.h 에 정의되어있음. domain 내용 PF_INET, AF_INET IPv4 인터넷 프로토콜을 사용합니다. PF_INET6, AF_INET6 IPv6 인터넷 프로토콜을 사용합니다. PF_LOCAL, AF_UNIX 같은 시스템 내에서 프로세스 끼리 통신합니다. PF_PACKET Low Level Socket 인터페이스를 이용합니다. PF_IPX IPX 노벨 프로토콜을 사용합니다. AF_UNSPEC 정의되어있지 않음. PF는 프로토콜 패밀리 이며, AF는 주소 패밀리 이다. PF_..
0. 리눅스 TCP/IP 통신 1. TCP/IP 통신 함수 사용순서 2. 서버 프로그램 3. 클라이언트 프로그램 이미지 출처 : http://forum.falinux.com/zbxe/index.php?document_srl=429387&mid=C_LIB