TCP 소켓 프로그래밍의 큰그림
- socket():소켓을 생성
- bind():호스트의 IP 주소를 소켓에 연결
- listen():LISTEN 상태로 전환 TCP
- accept():연결 요청 수락
- connect():연결 요청
- recv() / send():소켓으로 송수신
- close():소켓 닫기
소캣 생성
int socket(int domain, int type, int protocol);
- Parameter
- domain:통신 도메인 지정(프로토콜 집단)
- AF_UNIX, AF_LOCAL:로컬 통신
- AF_INET: IP 버전
- AF_INET6: IP 버전 6
- AF_IPX: 노벨 네트워크의 통신 프로토콜
- type:통신 방법 지정
- SOCK_STREAM:연결형 통신
- SOCK_DGRAM:비연결형 통신
- protocol:특정 프로토콜 지정
- Return
IP 주소를 소켓에 연결
int bind(int socketfd, struct sockaddr *my_addr, socklen_t addrlen);
- Parameter
- socetfd:생성된 소켓 디스크립터
- my_addr:호스트의 주소
- addrlen:my_addr의 바이트 길이
struct sockaddr{
short sin_family; // 주소 체계: AF_INET
u_short sin_port; // 16 비트 포트 번호, network byte order
struct in-_addr sin_addr; // 32비트 IP주소
char sin_zero[8]; // 전체 크기를 16비트로 맞추기 위한 dummy
};
//IP 주소를 담기 위한 구조체
strcut in_addr{
uint32_t addr; // 32 비트 IP 주소
// s_addr가 INADDR_ANY로 초기화될 경우:
// 자동으로 사용 가능한 인터페이스 IP 주소가 할당
};
LISTEN 상태(연결 요청 대기)로 전환
int listen(int socketfd, int backlog);
- Parameter
- socketfd: 소켓 디스크립터
- backlog: 연결 요청을 담을 큐(다수의 연결 요청이 들어올 수 있으므로)
- Return
상대방 연결 요청 수락
int accept(int socketfd, struct sockaddr *addr, socklen_t *addrlen);
- Parameter
- socketfd:소켓 디스크립터
- addr:연결 요청한 상대에 대한 정보
- addrlen: addr의 바이트 단위 길이
- Return
- 성공시 음이 아닌 정수형의 소켓 디스크립터
- 실패시 -1
연결 요청
int connect(int sockfd, const struct sockaddr *serv_addr, socklen_t addrlen);
- Parameter
- sockfd:소켓 디스크립터
- serv_addr:통신을 연결할 상대에 대한 정보
- addrlen:serv_addr의 길이
- Return
메시지 송수신
int send(int sockfd const void *msg, size_t msg_len, int flags);
int recv(int sockfd void *msg, size_t msg_len, int flags);
- Parameter
- sockfd:송수신할 소켓 디스크립터
- msg:송수신할 메시지
- msg_len:메시지 길이
- flags:송수신 방법 -> 일반적으로 0 초기화
- Return
- send:성공시 전손한 문자 수, 실패시 -1
- recv:성공시 수신한 바이트 수, 실패시 -1
연결 해제
int close(int fd);
- Parameter
- fd:닫으려는 소켓 디스크립터(파일 디스크립터로 close하는 것과 동일)
- Return