socket 프로그래밍 관련

함수명 원형
socket int socket(int family, int type, int protocol)
bind int bind(int sockfd, const struct sockaddr *my addr, socklen_t addrlen)
listen int listen(int sockfd, int backlog)
accept int accept(int sockfd, struct sockaddr *clientaddr, socklen_t *addrlen)
connect int connect(int sockfd, const struct sockaddr *serveraddr, socklen_t addrlen)
read ssize_t read(int fd, void *buff, size_t nbytes)
write ssize_t write(int fd, const void *buff, size_t nbytes)
함수명 정의 (매개 변수) 반환 값 사용처
socket 1. 소켓 생성을 위해 사용되는 함수 IPv4, Ipv6 도메인 선택
  1. 통신 방식 (TCP, UDP) 선택
  2. 프로토콜 선택 | 성공 = fd 실패 = -1 | server | | bind | 1. 프로토콜 주소를 소켓에 할당하는 함수 (sockaddr_in 형태의 구조체에 담긴 주소에 관련된 내용들을 소켓과 묶는 형태) | 성공 = 0 실패 = -1 | server | | listen | socket 함수를 통해 생성된 소켓이 client 소켓인지 server 소켓인지 분기하는 함수 | 성공 = 0 실패 = -1 | server | | accept | server 소켓이 client로부터 연결 요청을 받기 위한 함수 (accept 실행 후 서버는 요청이 들어올 때 까지 sleep) | 성공 = 0 실패 = -1 | server | | connect | server에서 accept의 인자로 던져진 fd에게 연결 요청을 하기 위한 함수 | 성공 = 0 실패 = -1 | client | | read | 연결된 대상이 write한 내용을 읽어들이는 함수 | 성공 = 읽어온 바이트 수 실패 = -1 | server client | | write | 연결된 대상이 read할 수 있도록 기록하는 함수 | 성공 = 기록한 바이트 수 실패 = -1 | server client |

socket 실습

int main() {
    int x = 1;
    int listenfd = socket(AF_INET, SOCK_STREAM, 0);

    struct sockaddr_in servaddr;
    servaddr.sin_family = AF_INET;
    servaddr.sin_port = htons(10000);
    servaddr.sin_addr.s_addr = htonl(INADDR_ANY);
    
    bind(listenfd, (struct sockaddr*) &servaddr, sizeof(servaddr));

    listen(listenfd, 5);

    int connfd = accept(listenfd, (struct sockaddr *) NULL, NULL);

    write(connfd, "Hello", 6);
    close(connfd);

    printf("Server: All done");

    return 0;
}
  1. 소켓 생성

int listenfd = socket(AF_INET, SOCK_STREAM, 0)

  1. bind 함수
struct sockaddr_in servaddr
servaddr.sin_family = AF_INET
servaddr.sin_port = htons(10000)
servaddr.sin_addr.s_addr = htonl(INADDR_ANY)
bind(listenfd, (struct sockaddr*) &servaddr, sizeof(servaddr))

htons() vs htonl() 비교

함수 변환 대상 크기 사용 예시
htons() short (16비트, 2바이트) 2B 포트 번호 (sin_port)
htonl() long (32비트, 4바이트) 4B IP 주소 (sin_addr.s_addr)