728x90
C 언어에서 소켓 통신과 웹소켓을 사용하는 방법에 대해 설명드리겠습니다. 먼저, 소켓 통신에 대한 기본적인 내용을 다루고, 이후 웹소켓을 사용하는 방법을 설명하겠습니다.
1. C 소켓 통신
C 언어에서 소켓 프로그래밍을 위해서는 sys/socket.h
, netinet/in.h
, arpa/inet.h
등의 헤더 파일을 포함해야 합니다. 다음은 기본적인 TCP 소켓 서버와 클라이언트의 예제입니다.
TCP 서버
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include <unistd.h>
#include <arpa/inet.h>
#include <sys/socket.h>
#define PORT 8080
#define BUF_SIZE 1024
int main() {
int server_fd, new_socket;
struct sockaddr_in address;
int addrlen = sizeof(address);
char buffer[BUF_SIZE] = {0};
char *hello = "Hello from server";
// 소켓 생성
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");
close(server_fd);
exit(EXIT_FAILURE);
}
// 리슨
if (listen(server_fd, 3) < 0) {
perror("listen failed");
close(server_fd);
exit(EXIT_FAILURE);
}
// 연결 수락
if ((new_socket = accept(server_fd, (struct sockaddr *)&address, (socklen_t*)&addrlen)) < 0) {
perror("accept failed");
close(server_fd);
exit(EXIT_FAILURE);
}
// 데이터 수신 및 전송
read(new_socket, buffer, BUF_SIZE);
printf("Message from client: %s\n", buffer);
send(new_socket, hello, strlen(hello), 0);
printf("Hello message sent\n");
close(new_socket);
close(server_fd);
return 0;
}
TCP 클라이언트
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include <unistd.h>
#include <arpa/inet.h>
#include <sys/socket.h>
#define PORT 8080
#define BUF_SIZE 1024
int main() {
int sock = 0;
struct sockaddr_in serv_addr;
char *hello = "Hello from client";
char buffer[BUF_SIZE] = {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");
read(sock, buffer, BUF_SIZE);
printf("Message from server: %s\n", buffer);
close(sock);
return 0;
}
2. 웹소켓
웹소켓은 일반적으로 C보다는 Python, Node.js 등의 고수준 언어에서 많이 사용됩니다. 그러나 C에서도 웹소켓 라이브러리를 사용하여 구현할 수 있습니다. 대표적으로 libwebsockets
라이브러리를 사용할 수 있습니다.
Libwebsockets 설치 및 사용
Libwebsockets 설치:
sudo apt-get update sudo apt-get install libwebsockets-dev
웹소켓 서버 예제:
#include <libwebsockets.h> #include <string.h> static int callback_http(struct lws *wsi, enum lws_callback_reasons reason, void *user, void *in, size_t len) { return 0; } static int callback_websocket(struct lws *wsi, enum lws_callback_reasons reason, void *user, void *in, size_t len) { switch (reason) { case LWS_CALLBACK_RECEIVE: lws_write(wsi, (unsigned char *)in, len, LWS_WRITE_TEXT); break; default: break; } return 0; } static struct lws_protocols protocols[] = { { "http", callback_http, 0, 0 }, { "websocket", callback_websocket, 0, 0 }, { NULL, NULL, 0, 0 } }; int main(void) { struct lws_context_creation_info info; struct lws_context *context; memset(&info, 0, sizeof info); info.port = 8000; info.protocols = protocols; context = lws_create_context(&info); if (context == NULL) { fprintf(stderr, "lws init failed\n"); return -1; } while (1) { lws_service(context, 1000); } lws_context_destroy(context); return 0; }
위 코드는 기본적인 웹소켓 서버를 설정하는 예제입니다.
웹소켓 서버는 클라이언트로부터 메시지를 수신하면 동일한 메시지를 클라이언트로 되돌려줍니다.
728x90
반응형
'Software > C' 카테고리의 다른 글
C 시작하기 - 병렬 프로그래밍 (4) | 2024.08.15 |
---|---|
C 시작하기 - 라이브러리 (0) | 2024.08.06 |
C 시작하기 - OpenCV 함수 4 (0) | 2024.08.06 |
C 시작하기 - OpenCV 함수 3 (0) | 2024.08.06 |
C 시작하기 - OpenCV 함수 2 (0) | 2024.08.06 |