TcpServer/TcpReactor Framework
This commit is contained in:
@@ -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*/
|
||||
Reference in New Issue
Block a user