TCP Socket 1

강윤경·2022년 10월 31일
0

Network

목록 보기
4/17

서버와 클라이언트가 공통으로 사용하는 구조체 및 함수


sockaddr

  • 소켓의 주소를 담는 기본 구조체 역할
struct sockaddr{
			u_short sa_family; // 주소 체계 구분하는 변수, 2바이트
			char sa_data[14];  // 실제 주소 저장, 14바이트
}

sockaddr_in

  • sockaddr 구조체는 IP 주소와 Port 번호가 조합되어 있어 쓰거나 읽기 불편하여 사용
  • 소켓의 주소를 담는 구조체
struct sockaddr_in{
			short sin_family; // 주소 체계 -> AF_INET(IPv4)
			u_short sin_port; // 16비트 포트 번호
			struct in_addr sin_addr; // 32비트 IP 주소
			char sin_zero[8]; // 전체 크기를 16비트로 맞추기 위한 변수
};

struct in_addr{
			u_long s_addr; // 32비트 IP 주소를 저장할 구조체
}

socket()

  • 헤더
    #include <sys/types.h>
    #include <sys/socket.h>
  • 함수 원형
    int socket(int domain, int type, int protocol);
    • 소켓 생성 후 반환
  • 인수
    int domain
    • 인터넷을 통해 통신할 지, 같은 시스템 내에서 프로세스끼리 통신할지의 여부 설정

      > PF_INET, AF_INET : IPv4 인터넷 프로토콜 사용
      PF_INET6 : IPv6 인터넷 프로토콜 사용
      PF_LOCAL, AF_UNIX : 같은 시스템 내에서 프로세스끼리 통신
      PF_PACKET : 저수준 소켓 인터페이스 사용
      PF_IPX : IPX 노벨 프로토콜을 사용
      > 
      int type
    • 데이터의 전송 형태를 지정

      > SOCK_STREAM : TCP/IP 프로토콜 이용
      SOCK_DGRAM : UDP/IP 프로토콜 이용
      > 
      int protocol
    • 통신에 있어 특정 프로토콜을 사용을 지정하기 위한 변수

    • 보통 0값 사용

  • 반환
    • 성공 : 0이상 (소켓 식별자)
    • 실패 : -1

memset()

  • 헤더
    #include <string.h>
  • 함수 원형

    void *memset(void *ptr, int value, size_t num);
    • 어떤 메모리의 시작점부터 연속된 범위를 어떤 값(바이트 단위)으로 모두 지정하고 싶을 때 사용하는 함수
  • 인수

    void *ptr
    • 채우고자 하는 메모리의 시작 포인터

      int value
    • 메모리에 채우고자 하는 값

    • int형 자료형이지만 내부에서는 unsigned char로 변환되어 저장

      size_t num
    • 메모리 크기의 바이트 수

  • 반환

    • 성공 : ptr
    • 실패 : 0 / NULL

send()

  • 헤더
    #include <sys/types.h>
    #include <sys/socket.h>
  • 함수 원형

    int send(int s, const void *msg, size_t len, int flags);
    • 연결된 서버나 클라이언트로 데이터 전송
  • 인수

    int s
    • 소켓 디스크립터

      void *msg
    • 전송할 데이터

      size_t len
    • 데이터의 바이트 단위 길이

      int flags
    • 사용 가능 옵션

      MSG_DONTWAIT : 전송할 준비가 전에 대기 상태가 필요하다면 기다리지 않고 -1을 반환하면서 복귀
      MSG_NOSIGNAL : 상대방과 연결이 끊겼을 때, SIGPTPE 시그널을 받지 않도록 한다.
      ⇒ SIGPIPE : 읽기 끝이 닫힌 파이프에 쓰기 시도 시 프로세스로 전송되는 깨진 파이프 신호

  • 반환

    • 성공 : 0 이상, 실제 전송한 바이트 수
    • 실패 : -1

recv()

  • 헤더

    #include <sys/types.h>
    #include <sys/socket.h>
  • 함수 원형

    int recv(int s, void *buf, size_t len, int flags);
    • 소켓으로부터 데이터를 수신
  • 인수

    int s
    • 소켓 디스크립터

      void *buf
    • 수신할 버퍼 포인터 데이터

      size_t len
    • 버퍼의 바이트 단위 크기

      int flags
    • 사용 가능 옵션

      MSG_DONTWAIT : 수신을 위해 대기가 필요하다면 기다리지 않고 -1을 반환하면서 바로 복귀
      MSG_NOSIGNAL : 상대방과 연결이 끊겼을 때, SIGPIPE 시그널을 받지 않는다.

  • 반환

    • 성공 : 0 이상, 실제 수신한 바이트 수
    • 실패 : -1

0개의 댓글