TcpServer/TcpReactor Framework

This commit is contained in:
2026-09-08 10:35:16 +08:00
parent 4711ab6603
commit ac4045a979
23 changed files with 1831 additions and 20 deletions
+140
View File
@@ -0,0 +1,140 @@
#ifndef INCLUDED_C_SOCKETUTIL_H
#define INCLUDED_C_SOCKETUTIL_H
#ifndef INCLUDED_C_SOCKET_H
#include <c_Socket.h>
#endif /*INCLUDED_C_SOCKET_H*/
#ifndef INCLUDED_C_ADDRINFO_H
#include <c_AddrInfo.h>
#endif /*INCLUDED_C_ADDRINFO_H*/
#ifndef INCLUDED_C_SOCKADDR_H
#include <c_SockAddr.h>
#endif /*INCLUDED_C_SOCKADDR_H*/
/* ------------------------------------------------------------------------------------------------------------------ */
/* */
C_STATIC_FORCE_INLINE
c_socket_t c_SocketUtil_CreateFromAddrInfo(c_AddrInfo_t* addr_info) {
if (!addr_info) return C_INVALID_SOCKET;
return socket(c_AddrInfo_GetFamily(addr_info),
c_AddrInfo_GetSockType(addr_info),
c_AddrInfo_GetProtocol(addr_info));
}
C_STATIC_FORCE_INLINE
c_err_t c_SocketUtil_BindWithAddrInfo(c_socket_t s, c_AddrInfo_t* addr_info) {
if (!c_Socket_IsValid(s) || !addr_info) return C_ERR_PARAM;
if (bind(s, addr_info->addrinfo_p->ai_addr, (int)addr_info->addrinfo_p->ai_addrlen) < 0) {
return C_ERR_FAIL;
}
return C_ERR_OK;
}
C_STATIC_FORCE_INLINE
c_err_t c_SocketUtil_BindWithSockAddr(c_socket_t s, c_SockAddr_t* sock_addr) {
if (!c_Socket_IsValid(s) || !sock_addr) return C_ERR_PARAM;
if (bind(s, (struct sockaddr*)&sock_addr->storage, (socklen_t)sock_addr->size) < 0) {
return C_ERR_FAIL;
}
return C_ERR_OK;
}
C_STATIC_FORCE_INLINE
c_socket_t c_SocketUtil_Accept(c_socket_t s, c_SockAddr_t* sock_addr) {
if (!c_Socket_IsValid(s) || !sock_addr) return C_INVALID_SOCKET;
memset(sock_addr, 0, sizeof(c_SockAddr_t));
socklen_t client_len = sizeof(sock_addr->storage);
c_socket_t socket_client = accept(s, (struct sockaddr*) &sock_addr->storage, &client_len);
if (!c_Socket_IsValid(socket_client)) return C_INVALID_SOCKET;
sock_addr->size = client_len;
return socket_client;
}
C_STATIC_FORCE_INLINE
c_err_t c_SocketUtil_GetNameInfoForSockAddr(c_SockAddr_t* sock_addr, char* host, c_size_t host_len, char* port, c_size_t port_len) {
if (!sock_addr) return C_ERR_PARAM;
if ((host && host_len > 0) && (!port || port_len==0)) {
int err = getnameinfo((struct sockaddr*)&sock_addr->storage, (socklen_t)sock_addr->size,
host, host_len, NULL, 0, NI_NUMERICHOST);
if (err!=0) {
return C_ERR_FAIL;
}
}else if ((!host || host_len == 0) && (port && port_len >0)) {
int err = getnameinfo((struct sockaddr*)&sock_addr->storage, (socklen_t)sock_addr->size
, NULL, 0,
port, port_len,
NI_NUMERICSERV);
if (err!=0) {
return C_ERR_FAIL;
}
}else {
int err = getnameinfo((struct sockaddr*)&sock_addr->storage, (socklen_t)sock_addr->size
, host, host_len
, port, port_len
, NI_NUMERICHOST|NI_NUMERICSERV);
if (err!=0) {
return C_ERR_FAIL;
}
}
return C_ERR_OK;
}
C_STATIC_FORCE_INLINE
c_err_t c_SocketUtil_Send(c_socket_t s, void* data, size_t data_len, c_size_t* send_size) {
if (!c_Socket_IsValid(s) || !data) return C_ERR_PARAM;
ssize_t err = send(s, (const char*)data, (int)data_len, 0);
if (err==0) return C_ERR_CLOSED;
if (err<0) return C_ERR_FAIL;
if (send_size) *send_size = err;
return C_ERR_OK;
}
C_STATIC_FORCE_INLINE
c_err_t c_SocketUtil_GetNameInfoForSocket(c_socket_t s, char* host, c_size_t host_len
, char* port, c_size_t port_len) {
if (!c_Socket_IsValid(s) ) return C_ERR_PARAM;
struct sockaddr_storage peer_addr;
socklen_t addr_len = sizeof(peer_addr);
// 2. 获取对方的套接字地址信息
if (getpeername(s, (struct sockaddr*)&peer_addr, &addr_len) == -1) {
return C_ERR_FAIL;
}
if (host && host_len > 0 && (!port || port_len==0)) {
int err = getnameinfo((struct sockaddr*)&peer_addr, addr_len,
host, host_len, NULL, 0, NI_NUMERICHOST);
if (err!=0) {
return C_ERR_FAIL;
}
}else if (port && port_len > 0 && (!host || host_len==0)) {
int err = getnameinfo((struct sockaddr*)&peer_addr, addr_len,
NULL, 0,
port, port_len,
NI_NUMERICSERV);
if (err!=0) {
return C_ERR_FAIL;
}
}else {
int err = getnameinfo((struct sockaddr*)&peer_addr, addr_len,
host, host_len,
port, port_len,
NI_NUMERICHOST|NI_NUMERICSERV);
if (err!=0) {
return C_ERR_FAIL;
}
}
return C_ERR_OK;
}
#endif /*INCLUDED_C_SOCKETUTIL_H*/