소켓 프로그래밍 (1) 네트워크 프로그래밍과 소켓의 이해
소켓 생성함수
#include<sys/socket.h>
int socket(int domain, int type, int protocol);
-> 성공 시 파일 디스크립터, 실패시 –1 반환
-> Socket이라는 함수가 소켓을 생성하는구나.
bind 함수
#include<sys/socket.h>
int bind(int sockfd, struct sockaddr *myaddr, socklen_t addrlen);
-> 성공시 0, 실패 시 –1 반환
-> IP, 포트번호, 소켓의 주소정보를 할당.
listen 함수
#include<sys/socket.h>
int listen(int sockfd, int backlog);
-> 소켓을 연결요청이 가능한 상태가 되게 함.
accept 함수
#include<sys/socket.h>
int accept(int sockfd, struct sockaddr *addr, socklen_t *addrlen);
-> 성공 시 파일 디스크립터, 실패시 –1반환
소켓의 생성과정
소켓 생성 (socket함수 호출)
IP주소와 PORT번호 할당 (bind함수 호출)
연결요청 가능상태로 변경 (listen함수 호출)
연결요청에 대한 수락(accept함수 호출)
server : 연결요청을 수락하는 기능의 프로그램
서버 소켓 or 리스닝 소켓 : 서버 프로그램에서 생성한 소켓
클라이언트 소켓
#include<sys/socket.h>
int connect(int sockfd, struct sockaddr *serv_addr, socklen_t addrlen);
-> 성공 시 0, 실패 시 –1 반환
클라이언트 소켓 생성 과정
socket 함수 호출을 통한 소켓의 생성
connect 함수 호출을 통한 서버로의 연결요청 과정
파일 디스크립터
0 : 표준 입력 – Standard Input
1 : 표준 출력 – Standard Output
2 : 표준 에러 – Standard Error
파일 열기
#include<sys/types.h>
#include<sys/stat.h>
#include<fcntl.h>
int open(const char*path, int flag);
-> 성공 시 파일 디스크립터, 실패시 –1 반환
-> path : 파일 이름을 나타내는 문자열의 주소 값 전달
-> flag : 파일의 오픈 모드 정보(파일의 특성 정보)
-> flag에 전달할 수 있는 값과 그 의미
-> (1) O_CREAT : 필요하면 파일을 생성
-> (2) O_TRUNC : 기존 데이터 전부 삭제
-> (3) O_APPEND : 기존 데이터 보존하고, 뒤에 이어서 저장
-> (4) O_RDONLY : 읽기 전용으로 파일 오픈
-> (5) O_WRONLY : 쓰기 전용으로 파일 오픈
-> (6) O_RDWR : 읽기, 쓰기 겸용으로 파일 오픈
파일 닫기
#include <unistd.h>
int close(int fd);
-> 성공 시 0, 실패 시 –1반환
-> 파일은 사용 후 반드시 닫아줘야 한다.
-> 파일뿐만 아니라 소켓을 닫을 때도 사용된다.
-> 여기서 파일과 소켓을 구분하지 않는다는 리눅스 운영체제의 특성을 볼 수 있다.
파일에 데이터 쓰기
#include <unistd.h>
ssize_t write(int fd, const void * buf, size_t nbytes);
-> 성공 시 전달한 바이트 수, 실패 시 –1 반환
-> fd : 데이터 전송대상을 나타내는 파일 디스크립터 전달
-> buf : 전송할 데이터가 저장된 버퍼의 주소 값 전달
-> nbytes : 전송할 데이터의 바이트 수 전달
파일에 저장된 데이터 읽기
#include <unistd.h>
ssize_t read(int fd, void *buf, size_t nbytes);
-> 성공 시 수신한 바이트 수(단 파일의 끝을 만나면 0), 실패 시 –1 반환
-> fd : 데이터 수신대상을 나타내는 파일 스크립터 전달
-> buf : 수신한 데이터를 저장할 버퍼의 주소 값 전달
-> nbytes : 수신할 최대 바이트 수 전달