#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); deBool deSocketAddress_setFamily (deSocketAddress* address, deSocketFamily family); deSocketFamily deSocketAddress_getFamily (const deSocketAddress* address); deBool deSocketAddress_setType (deSocketAddress* address, deSocketType type); deSocketType deSocketAddress_getType (const deSocketAddress* address); deBool deSocketAddress_setProtocol (deSocketAddress* address, deSocketProtocol protocol); deSocketProtocol deSocketAddress_getProtocol (const deSocketAddress* address); deBool deSocketAddress_setPort (deSocketAddress* address, int port); int deSocketAddress_getPort (const deSocketAddress* address); deBool 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); deUint32 deSocket_getOpenChannels (const deSocket* socket); deBool deSocket_setFlags (deSocket* socket, deUint32 flags); deBool deSocket_listen (deSocket* socket, const deSocketAddress* address); deSocket* deSocket_accept (deSocket* socket, deSocketAddress* clientAddress); deBool deSocket_connect (deSocket* socket, const deSocketAddress* address); deBool deSocket_shutdown (deSocket* socket, deUint32 channels); deBool 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 */