시스템 프로그래밍-TCP 소켓 다루기

YuWan·2024년 7월 3일

linux

목록 보기
16/26

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
    • 성공시 소켓 디스크립터
    • 실패시 -1

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 주소가 할당
};
  • Return
    • 성공시 0
    • 실패시 -1

LISTEN 상태(연결 요청 대기)로 전환

int listen(int socketfd, int backlog);
  • Parameter
    • socketfd: 소켓 디스크립터
    • backlog: 연결 요청을 담을 큐(다수의 연결 요청이 들어올 수 있으므로)
  • Return
    • 성공시 0
    • 실패시 -1

상대방 연결 요청 수락

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
    • 성공시 0
    • 실패시 -1

메시지 송수신

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
    • 성공시 0
    • 실패시 -1
profile
공부 블로그

0개의 댓글