
Tetsuo Socket Library
성숙도 알림: 이 라이브러리는 기능적이며 잘 테스트되었지만 최근에 출시되었습니다. 개발, 내부 도구 및 제어된 환경에 적합합니다. 신뢰할 수 없는 네트워크 입력을 사용하는 프로덕션 배포는 코드베이스에 몇 달간의 실제 환경 강화가 축적될 때까지 기다려야 합니다.
POSIX 시스템을 위한 고성능 예외 기반 소켓 도구 키트입니다. TCP, UDP, 유닉스 도메인 소켓, HTTP/1.1, HTTP/2, QUIC, WebSocket 및 TLS/DTLS를 위한 깔끔하고 현대적인 C API를 제공하며, 포괄적인 오류 처리, 제로 카피 I/O 및 크로스 플랫폼 이벤트 폴링을 지원합니다.
TRY/EXCEPT/FINALLY를 통한 깔끔한 오류 전파sendfile() 및 분산/수집 I/O| 기능 | Linux | BSD/macOS | 대체 |
|---|---|---|---|
| 이벤트 폴링 | epoll | kqueue | poll(2) |
| 비동기 I/O | io_uring (5.1+) | kqueue AIO | 에지 트리거 |
| TCP Fast Open | 3.7+ | 10.0+/10.11+ | 비활성화 |
| 혼잡 제어 | 구성 가능 | - | - |
| 피어 자격 증명 | SO_PEERCRED | LOCAL_PEERCRED | - |
| SYN 보호 | TCP_DEFER_ACCEPT | SO_ACCEPTFILTER | 사용자 공간 |
cmake -S . -B build cmake --build build -j
cd build && ctest --output-on-failure
cmake -S . -B build -DENABLE_TLS=ON
cmake -S . -B build -DENABLE_SANITIZERS=ON
cmake -S . -B build -DENABLE_FUZZING=ON -DCMAKE_C_COMPILER=clang
### 기본 TCP 서버```c
#include "socket/Socket.h"
#include "core/Except.h"
#include <stdio.h>
int main(void)
{
Socket_T server = Socket_new(AF_INET, SOCK_STREAM, 0);
TRY
Socket_setreuseaddr(server);
Socket_bind(server, NULL, 8080);
Socket_listen(server, 128);
printf("Server listening on port 8080...\n");
while (1) {
Socket_T client = Socket_accept(server);
if (client) {
char buf[1024];
ssize_t n = Socket_recv(client, buf, sizeof(buf) - 1);
if (n > 0) {
buf[n] = '\0';
Socket_sendall(client, buf, n);
}
Socket_free(&client);
}
}
EXCEPT(Socket_Failed)
fprintf(stderr, "Error: %s\n", Socket_GetLastError());
END_TRY;
Socket_free(&server);
return 0;
}
#include "socket/Socket.h" #include "core/Except.h" #include <stdio.h> #include <string.h>
int main(void) { Socket_T client = Socket_new(AF_INET, SOCK_STREAM, 0);
TRY
Socket_connect(client, "127.0.0.1", 8080);
printf("Connected to server\n");
const char *msg = "Hello, Server!";
Socket_sendall(client, msg, strlen(msg));
char buf[1024];
ssize_t n = Socket_recvall(client, buf, strlen(msg));
buf[n] = '\0';
printf("Received: %s\n", buf);
EXCEPT(Socket_Failed)
fprintf(stderr, "Error: %s\n", Socket_GetLastError());
EXCEPT(Socket_Closed)
fprintf(stderr, "Connection closed\n");
END_TRY;
Socket_free(&client);
return 0;
}
### 편의 함수 (단일 호출 설정)
일반적인 사용 사례를 위해 편의 함수가 소켓 설정을 간소화합니다:```c
#include "socket/Socket.h"
#include "socket/SocketDgram.h"
/* TCP Server - one call creates listening socket */
Socket_T server = Socket_listen_tcp("0.0.0.0", 8080, 128);
while (running) {
Socket_T client = Socket_accept_timeout(server, 1000); // 1s timeout
if (client) handle_client(client);
}
Socket_free(&server);
/* TCP Client with timeout - one call connects */
Socket_T client = Socket_connect_tcp("api.example.com", 443, 5000); // 5s timeout
Socket_sendall(client, request, len);
Socket_free(&client);
/* UDP Server - one call binds */
SocketDgram_T udp = SocketDgram_bind_udp("0.0.0.0", 5353);
SocketDgram_recvfrom(udp, buf, sizeof(buf), sender_ip, sizeof(sender_ip), &sender_port);
SocketDgram_free(&udp);