#ifndef INCLUDED_C_SOCKETUTIL_H #define INCLUDED_C_SOCKETUTIL_H #ifndef INCLUDED_C_SOCKET_H #include #endif /*INCLUDED_C_SOCKET_H*/ #ifndef INCLUDED_C_ADDRINFO_H #include #endif /*INCLUDED_C_ADDRINFO_H*/ #ifndef INCLUDED_C_SOCKADDR_H #include #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*/