[c언어] 소켓 프로그래밍 실습
이번 튜토리얼에서는 C언어를 사용하여 소켓 프로그래밍을 실습할 것입니다. 소켓을 사용하여 네트워크 통신을 구현할 수 있으며, 이를 통해 클라이언트와 서버 간에 데이터를 교환할 수 있습니다.
소켓 프로그래밍이란?
소켓은 네트워크 상에서 클라이언트와 서버 간에 양방향 통신을 가능케 하는 인터페이스입니다. 소켓을 사용하면 데이터를 전송하고 수신하는 데 사용되며, TCP 또는 UDP를 통해 통신할 수 있습니다.
실습 환경
이 실습을 진행하기 위해 리눅스 운영체제가 설치된 시스템이 필요합니다. 또한, C언어로 작성된 편집기와 컴파일러도 필요합니다.
실습 단계
-
서버 소켓 만들기: 먼저 서버 측 코드를 작성하여 소켓을 생성하고 클라이언트의 접속을 대기합니다.
-
클라이언트 소켓 만들기: 다음으로 클라이언트 측 코드를 작성하여 서버에 접속하고 데이터를 송수신합니다.
-
데이터 송수신: 마지막으로 서버와 클라이언트 간에 데이터를 주고받는 코드를 작성합니다.
코드 예제
서버 측 코드
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <unistd.h>
#include <sys/types.h>
#include <sys/socket.h>
#include <netinet/in.h>
#define PORT 8080
int main() {
int server_fd, new_socket;
struct sockaddr_in address;
int addrlen = sizeof(address);
char buffer[1024] = {0};
if ((server_fd = socket(AF_INET, SOCK_STREAM, 0)) == 0) {
perror("socket failed");
exit(EXIT_FAILURE);
}
address.sin_family = AF_INET;
address.sin_addr.s_addr = INADDR_ANY;
address.sin_port = htons(PORT);
if (bind(server_fd, (struct sockaddr *)&address, sizeof(address))<0) {
perror("bind failed");
exit(EXIT_FAILURE);
}
if (listen(server_fd, 3) < 0) {
perror("listen");
exit(EXIT_FAILURE);
}
if ((new_socket = accept(server_fd, (struct sockaddr *)&address, (socklen_t*)&addrlen))<0) {
perror("accept");
exit(EXIT_FAILURE);
}
read(new_socket, buffer, 1024);
printf("Message from client: %s\n", buffer);
return 0;
}
클라이언트 측 코드
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <sys/types.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <netdb.h>
#define PORT 8080
int main() {
int sock = 0;
struct sockaddr_in serv_addr;
char *hello = "Hello from client";
char buffer[1024] = {0};
if ((sock = socket(AF_INET, SOCK_STREAM, 0)) < 0) {
printf("\n Socket creation error \n");
return -1;
}
serv_addr.sin_family = AF_INET;
serv_addr.sin_port = htons(PORT);
if(inet_pton(AF_INET, "127.0.0.1", &serv_addr.sin_addr)<=0) {
printf("\nInvalid address/ Address not supported \n");
return -1;
}
if (connect(sock, (struct sockaddr *)&serv_addr, sizeof(serv_addr)) < 0) {
printf("\nConnection Failed \n");
return -1;
}
send(sock , hello , strlen(hello) , 0 );
printf("Hello message sent\n");
return 0;
}
결론
이제 C언어로 소켓 프로그래밍을 실습하여 서버와 클라이언트 간에 데이터를 주고받을 수 있게 되었습니다. 이를 통해 네트워크 프로그래밍에 대한 기본적인 이해를 얻을 수 있습니다. 소켓 프로그래밍을 활용하여 더 복잡한 네트워크 응용프로그램을 개발할 수 있습니다.