소켓은 라이브러리와 시스템 콜, 두 가지 개념을 포함한다.
소켓 라이브러리: 소켓 프로그래밍을 위한 API(응용 프로그램 인터페이스)를 제공하는 라이브러리이다. 대표적인 예로는 소켓 프로그래밍을 위한 네트워크 라이브러리인 "Winsock" (Windows용)과 "BSD 소켓" (유닉스 및 유닉스 계열 운영체제용)이 있다. 소켓 라이브러리는 프로그래밍 언어별로 제공되며, 개발자는 이러한 라이브러리를 사용하여 소켓을 생성하고 관리하며, 데이터를 주고받을 수 있다.
소켓 시스템 콜: 운영체제 수준에서 소켓 기능을 제어하기 위한 시스템 콜이다. 소켓 시스템 콜은 운영체제 커널에 의해 제공되며, 네트워크 연결, 데이터 전송, 에러 처리 등과 같은 저수준의 네트워크 작업을 수행한다. 개발자는 소켓 라이브러리를 사용하여 소켓 시스템 콜을 호출하고, 운영체제의 네트워크 스택과 상호작용하여 네트워크 통신을 수행한다.
따라서, 소켓은 라이브러리와 시스템 콜의 조합으로 이루어진 개념이며, 라이브러리를 사용하여 소켓을 조작하고, 시스템 콜을 통해 운영체제의 네트워크 기능을 활용한다.
클라이언트-서버 트랜잭션에서 소켓 인터페이스는 다음과 같이 동작한다.
서버 설정:
클라이언트 연결:
데이터 송수신:
send()
함수를 사용한다.recv()
함수를 사용하여 클라이언트로부터 데이터를 수신한다.send()
함수를 사용하여 클라이언트에게 전송한다.recv()
함수를 사용하여 서버로부터 응답 데이터를 수신한다.연결 종료:
close()
함수를 사용하여 소켓을 닫고, 연결을 종료한다.위의 개요를 통해 클라이언트와 서버는 소켓 인터페이스 함수를 호출하여 네트워크를 통해 효율적인 통신을 수행할 수 있다.
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <sys/socket.h>
#include <arpa/inet.h>
#define SERVER_IP "127.0.0.1"
#define SERVER_PORT 12345
int main() {
int client_socket;
struct sockaddr_in server_address;
char server_message[256];
// 클라이언트 소켓 생성
client_socket = socket(AF_INET, SOCK_STREAM, 0);
if (client_socket < 0) {
perror("소켓 생성 실패");
exit(EXIT_FAILURE);
}
// 서버 주소 설정
server_address.sin_family = AF_INET;
server_address.sin_port = htons(SERVER_PORT);
if (inet_pton(AF_INET, SERVER_IP, &(server_address.sin_addr)) <= 0) {
perror("잘못된 서버 주소");
exit(EXIT_FAILURE);
}
// 서버에 연결
if (connect(client_socket, (struct sockaddr *)&server_address, sizeof(server_address)) < 0) {
perror("서버 연결 실패");
exit(EXIT_FAILURE);
}
// 서버로 데이터 전송
strcpy(server_message, "Hello, server!");
if (send(client_socket, server_message, strlen(server_message), 0) < 0) {
perror("데이터 전송 실패");
exit(EXIT_FAILURE);
}
// 서버로부터 데이터 수신
memset(server_message, 0, sizeof(server_message));
if (recv(client_socket, server_message, sizeof(server_message), 0) < 0) {
perror("데이터 수신 실패");
exit(EXIT_FAILURE);
}
printf("Received: %s\n", server_message);
// 소켓 연결 종료
close(client_socket);
return 0;
}
#include <sys/socket.h>
struct sockaddr {
unsigned short sa_family; // 주소 패밀리 (Address Family)
char sa_data[14]; // 주소 데이터
};
struct sockaddr_in {
short sin_family; // 주소 패밀리 (Address Family)
unsigned short sin_port; // 포트 번호
struct in_addr sin_addr; // IP 주소
char sin_zero[8]; // 사용되지 않음
};
struct in_addr {
unsigned long s_addr; // 32비트 IP 주소
};
위의 구조체는 소켓 프로그래밍에서 주로 사용되는 구조체 중 일부이다. struct sockaddr
는 일반적인 소켓 주소를 나타내며, struct sockaddr_in
은 IPv4 주소와 포트 번호를 포함하는 소켓 주소를 나타낸다. struct in_addr
는 32비트의 IPv4 주소를 나타내는 데 사용된다.
안녕하세요 2기 수료자님 취업하셨나요??