//============================================================================== std::shared_ptr<Socket> SocketImpl::Accept() const noexcept { auto ret = std::make_shared<SocketImpl>(m_protocol, m_spConfig); struct sockaddr_in socketAddress; auto *pSocketAddress = reinterpret_cast<sockaddr *>(&socketAddress); socklen_t socketAddressLength = sizeof(socketAddress); socket_type skt = ::accept(m_socketHandle, pSocketAddress, &socketAddressLength); if (skt == InvalidSocket()) { SLOGS(m_socketHandle, "Error accepting"); ret.reset(); } else { SLOGD( m_socketHandle, "Accepted new socket: %d (%d)", ret->GetSocketId(), skt); ret->m_socketHandle = skt; ret->m_clientIp = ntohl(socketAddress.sin_addr.s_addr); ret->m_clientPort = ntohs(socketAddress.sin_port); ret->m_aConnectedState.store(ConnectedState::Connected); } return ret; }
void CNetSock::CloseSocket() { if (INVALID_SOCKET != m_s) { closesocket(m_s); InvalidSocket(); } }
//============================================================================== void SocketImpl::Close() noexcept { if (IsValid()) { ::close(m_socketHandle); m_socketHandle = InvalidSocket(); } }
void Socket::close(){ if(::shutdown(_socket, 2) == -1){ switch(errno){ case EBADF: throw InvalidFileDescriptor(_socket); break; case ENOTSOCK: throw InvalidSocket(_socket); break; case ENOTCONN: //Lets say you can close it again. break; default: throw NetworkException(errno); } } }
void CNetSock::Init() { InvalidSocket(); memset(&m_sa,0,sizeof(m_sa)); CloseSocket(); }