#ifndef _DESOCKET_H #define _DESOCKET_H /*------------------------------------------------------------------------- * drawElements Utility Library * ---------------------------- * * Copyright 2014 The Android Open Source Project * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. * *//*! * \file * \brief Socket abstraction. * * Socket API is thread-safe except to: * - listen() * - connect() * - destroy() *//*--------------------------------------------------------------------*/ #include "deDefs.h" DE_BEGIN_EXTERN_C /* Socket types. */ typedef struct deSocket_s deSocket; typedef struct deSocketAddress_s deSocketAddress; typedef enum deSocketFamily_e { DE_SOCKETFAMILY_INET4 = 0, DE_SOCKETFAMILY_INET6, DE_SOCKETFAMILY_LAST } deSocketFamily; typedef enum deSocketType_e { DE_SOCKETTYPE_STREAM = 0, DE_SOCKETTYPE_DATAGRAM, DE_SOCKETTYPE_LAST } deSocketType; typedef enum deSocketProtocol_e { DE_SOCKETPROTOCOL_TCP = 0, DE_SOCKETPROTOCOL_UDP, DE_SOCKETPROTOCOL_LAST } deSocketProtocol; typedef enum deSocketFlag_e { DE_SOCKET_KEEPALIVE = (1 << 0), DE_SOCKET_NODELAY = (1 << 1), DE_SOCKET_NONBLOCKING = (1 << 2), DE_SOCKET_CLOSE_ON_EXEC = (1 << 3) } deSocketFlag; /* \todo [2012-07-09 pyry] Separate closed bits for send and receive channels. */ typedef enum deSocketState_e { DE_SOCKETSTATE_CLOSED = 0, DE_SOCKETSTATE_CONNECTED = 1, DE_SOCKETSTATE_LISTENING = 2, DE_SOCKETSTATE_DISCONNECTED = 3, DE_SOCKETSTATE_LAST } deSocketState; typedef enum deSocketResult_e { DE_SOCKETRESULT_SUCCESS = 0, DE_SOCKETRESULT_WOULD_BLOCK = 1, DE_SOCKETRESULT_CONNECTION_CLOSED = 2, DE_SOCKETRESULT_CONNECTION_TERMINATED = 3, DE_SOCKETRESULT_ERROR = 4, DE_SOCKETRESULT_LAST } deSocketResult; typedef enum deSocketChannel_e { DE_SOCKETCHANNEL_RECEIVE = (1 << 0), DE_SOCKETCHANNEL_SEND = (1 << 1), DE_SOCKETCHANNEL_BOTH = DE_SOCKETCHANNEL_RECEIVE | DE_SOCKETCHANNEL_SEND } deSocketChannel; /* Socket API, similar to Berkeley sockets. */ deSocketAddress *deSocketAddress_create(void); void deSocketAddress_destroy(deSocketAddress *address); bool deSocketAddress_setFamily(deSocketAddress *address, deSocketFamily family); deSocketFamily deSocketAddress_getFamily(const deSocketAddress *address); bool deSocketAddress_setType(deSocketAddress *address, deSocketType type); deSocketType deSocketAddress_getType(const deSocketAddress *address); bool deSocketAddress_setProtocol(deSocketAddress *address, deSocketProtocol protocol); deSocketProtocol deSocketAddress_getProtocol(const deSocketAddress *address); bool deSocketAddress_setPort(deSocketAddress *address, int port); int deSocketAddress_getPort(const deSocketAddress *address); bool deSocketAddress_setHost(deSocketAddress *address, const char *host); const char *deSocketAddress_getHost(const deSocketAddress *address); deSocket *deSocket_create(void); void deSocket_destroy(deSocket *socket); deSocketState deSocket_getState(const deSocket *socket); uint32_t deSocket_getOpenChannels(const deSocket *socket); bool deSocket_setFlags(deSocket *socket, uint32_t flags); bool deSocket_listen(deSocket *socket, const deSocketAddress *address); deSocket *deSocket_accept(deSocket *socket, deSocketAddress *clientAddress); bool deSocket_connect(deSocket *socket, const deSocketAddress *address); bool deSocket_shutdown(deSocket *socket, uint32_t channels); bool deSocket_close(deSocket *socket); deSocketResult deSocket_send(deSocket *socket, const void *buf, size_t bufSize, size_t *numSent); deSocketResult deSocket_receive(deSocket *socket, void *buf, size_t bufSize, size_t *numReceived); /* Utilities. */ const char *deGetSocketFamilyName(deSocketFamily family); const char *deGetSocketResultName(deSocketResult result); DE_END_EXTERN_C #endif /* _DESOCKET_H */