Socket Programming

2021. 6. 14. 00:32Layer7/C

728x90

- 소켓(Socket)이란?

 

소켓의 사전적 정의는 "컴퓨터 네트워크를 경유하는 프로세스 간 통신의 종착점"입니다.

이를 간단하게 풀어 생각하면 데이터를 송수신 할 때 쓰이는 하나의 방이라고 생각하면 될 것 같습니다.

 

 

- Socket과 http의 차이

 

둘의 차이를 표로 정리하여 비교해보면 이렇습니다.

Socket http
단방향 통신(Client->Server) 양방향 통신
서버로 접근해야 할 때 용이 실시간 연결 할 때 용이
자원을 적게 소모 자원을 많이 소모

소켓은 여러가지 분야에 널리 사용됩니다.

 

 

- 서버와 클라이언트의 소켓통신 과정 (소켓 프로그래밍)

 

과정을 간단히 정리한 사진

socket() 함수를 사용하여 소켓을 생성해줍니다.

 

그리고 서버에서 bind() 함수를 사용합니다.

bind() 함수는 client가 아닌 server에서만 사용하는 함수입니다.

이 함수를 사용하여 소켓에 IP 주소와 Port를 할당해줍니다.

 

listen() 함수 역시 server에서만 사용하는 함수이며, 서버를 대기 상태로 만들어놓는 함수입니다.

 

client에서 connect() 함수를 사용해 서버에 연결을 시도하고

server에서는 accept() 함수로 연결을 받아들입니다.

 

그리고 각각 read(), write() 함수를 사용해서 데이터 송수신을 합니다.

 

마지막으로 close() 함수를 사용합니다.

close() 함수는 연결을 종료하는 함수인데, 이를 쓰지 않으면 여러가지 오류가 날 수 있습니다.

 

 

- 함수 설명

 

위에서 말했던 함수들을 자세히 설명하겠습니다.

 

  • socket()
    • int socket(int 통신영역, int 소켓 서비스 타입, int 소켓 프로토콜)
    • ex) serv_sock = socket(PF_INET, SOCK_STREAM, 0);
    • PF_INET : IPv4 사용
    • SOCK_STREAM : TCP 사용
    • 0 : type에서 정한 프로토콜 사용
  • bind()
    • int bind(int sockfd, struct sockaddr *서버 IP, socklen_t 서버 IP 길이);
    • ex) bind(serv_sock, (struct sockaddr*) &serv_addr, sizeof(serv_addr))
    • 성공 시 0, 실패 시 -1
  • listen()
    • int listen(int sockfd, int 연결 대기열 크기)
    • ex) listen(serv_sock, 5)
    • 성공 시 0, 실패 시 -1
  • accept()
    • int accept(int sockfd, struct sockaddr *클라이언트 주소, socklen_t 주소길이)
    • ex) accept(serv_sock, (struct sockaddr*) &clnt_addr, &szClntAddr)
    • 성공 시 받아들인 sockfd(client), 실패 시 -1
  • connect()
    • int connect(int sockfd, struct sockaddr *서버 주소, socklen_t 주소길이)
    • ex) connect(clnt_sock, (struct sockaddr *)&serv_addr, sizeof(serv_addr))
    • 성공 시 받아들인 sockfd(server), 실패 시 -1
    • Server의 accept와 유사
  • close()
    • int close(int sockfd)
    • ex) close(clnt_sock);
    • 성공 시 0, 실패 시 -1

 

 

- 소켓 통신으로 서버에 학번 보내기 (소스코드)

 

#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#include<unistd.h>
#include<arpa/inet.h>
#include<sys/socket.h>
#define BUFSIZE 50

void err_handling(char *msg){
	perror(msg);
	exit(1);
}

int main(int argc, char *argv[]){
	int client_sock,client_len;
	char one[BUFSIZE]={0},two[BUFSIZE]={0};
	struct sockaddr_in serv_addr;
	
	client_sock=socket(PF_INET,SOCK_STREAM,0); 
	if(client_sock<0){
		err_handling("socket err\n");
	}
	
	memset(&serv_addr,0,sizeof(serv_addr));
	serv_addr.sin_family=AF_INET;
	serv_addr.sin_addr.s_addr=inet_addr("152.70.238.188");
	serv_addr.sin_port=htons(3000);
	
	if(connect(client_sock,(struct sockaddr *)&serv_addr,sizeof(serv_addr))<0){
	    err_handling("connect err\n");
	}   
	    
	scanf("%s",one);        
	write(client_sock,one,strlen(one));  
	memset(one,0,BUFSIZE);
	read(client_sock,two,BUFSIZE);          
	printf("%s",two);   
	memset(two,0,BUFSIZE);
	close(client_sock);      
	return 0;
}
728x90

'Layer7 > C' 카테고리의 다른 글

포인터(Pointer)에 대하여  (0) 2021.05.12