Adblock_detected

AdBlock을 사용중이시네요..

index.html

C 소켓 프로그래밍

[CODE]

소켓은 두 프로세스가 네트워크를 통해 소통하는 방법 중 하나 인데요

한 소켓이 특정 IP 에 특정 포트에서 대기하고 있으면

다른 소켓이 그 소켓을 찾아가 연결하는 방식이죠


서버쪽 소켓부터 한번 순서대로 볼까요?

int socket = socket(int domain, int type, int protocol)

먼저 socket() 으로 소켓을 만들어 줘야 되는데요, 이때


domain 에는 통신 도메인(예: AF_INET(IPv4) , AF_INET6(IPv6)...)

type 에는 만들 소켓의 타입(예: SOCK_STREAM(TCP), SOCK_DGRAM(UDP)...)

protocol 에는 통신 프로토콜이 들어가는데 이 칸에는 0 을 넣어두면

요청된 소켓 타입에 맞춰 알아서 생성된다고 하네요..


다음은 소켓을 bind 해줘야 하는데요 

bind 는 소켓에 IP 주소와 포트번호 등을 지정해 주는 과정이에요


근데 여기서 IP 주소랑 포트번호를 bind 함수에 바로 넣어주는게 아니라

sockaddr 이라는 struck 에 넣어서 bind 함수에 넣어 주는데요


저는 IPv4 방식을 사용할 거기 때문에 sockaddr 대신 sockaddr_in 을 사용해 볼게요

struct sockaddr_in serveraddr;
bzero(&serveraddr, sizeof(serveraddr));

serveraddr.sin_addr.s_addr = htonl(INADDR_ANY);
serveraddr.sin_port = htons(port);
serveraddr.sin_family = AF_INET;

먼저 bzero() 는 0x00 으로 메모리 영역을 초기화 해주는 함수고

htons() 와 htonl 은 int 를 network byte order 로 바꿔주는거라고 하네요!


sockaddr_in 에는 변수가 3개 들어가는데요

sin_family 에는 주소 타입(AF_INET 써주시면 되요)

sin_port 에는 포트번호, sin_addr 에는 IP주소를 넣어 주시면 되는데

특정 IP 를 정해줄 필요가 없을때는 저처럼 INADDR_ANY 를 써주세요


이제 bind 를 해야겠죠?

bind(int socket, struct sockaddr *address, socklen_t *address_len);

socket 에는 아까 만든 소켓 변수이름

sockaddr *address 에는 방금 만든 sockaddr struct 주소,

저는 sockaddr_in 을 썼기 때문에 (struct sockaddr *)&serveraddr 이렇게 써서 변환해 줘야 했어요

그리고 address_len 에는 sizeof(serveraddr) 이런식으로 sockaddr 의 사이즈를 넣어주면 되요


이제 listen() 을 써서 소켓이 커넥션을 받을 수 있게 해줄건데요

listen(int socket, int backlog);

여기는 들어갈 변수가 두개밖에 없어요

socket 에는 소켓 변수이름, backlog 에는 최대 커넥션 대기자 수를 적어주시면 되요


마지막으로 accept() 를 써서 클라이언트와 커넥션을 맺을건데요

int client_socket =  accept(int socket, struct sockaddr *address, socklen_t *address_len);

아까 bind 때랑 들어가는 변수들이 같죠?

근데 여기는 아까 사용한 struct 말고 새 struct 를 만들어서 써야되요


구지 값을 넣어줄 필요는 없고

struct sockaddr_in clientaddr;

이렇게 생성만 하고 넣어주세요


이제 클라이언트 소켓 쪽을 볼까요?

소켓과 struct 를 만드는거 까지는 서버와 똑같고

connect(int sockfd, const struct sockaddr *addr, socklen_t *address_len);

그 다음엔 이렇게 connect() 함수 하나만 쓰면 끝이에요


유용하셨으면 공감버튼 부탁드려요!

1 2 3 4 5 6 7 8 ··· 43