Home | History | Annotate | Download | only in deutil
      1 #ifndef _DESOCKET_H
      2 #define _DESOCKET_H
      3 /*-------------------------------------------------------------------------
      4  * drawElements Utility Library
      5  * ----------------------------
      6  *
      7  * Copyright 2014 The Android Open Source Project
      8  *
      9  * Licensed under the Apache License, Version 2.0 (the "License");
     10  * you may not use this file except in compliance with the License.
     11  * You may obtain a copy of the License at
     12  *
     13  *      http://www.apache.org/licenses/LICENSE-2.0
     14  *
     15  * Unless required by applicable law or agreed to in writing, software
     16  * distributed under the License is distributed on an "AS IS" BASIS,
     17  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
     18  * See the License for the specific language governing permissions and
     19  * limitations under the License.
     20  *
     21  *//*!
     22  * \file
     23  * \brief Socket abstraction.
     24  *
     25  * Socket API is thread-safe except to:
     26  *  - listen()
     27  *  - connect()
     28  *  - destroy()
     29  *//*--------------------------------------------------------------------*/
     30 
     31 #include "deDefs.h"
     32 
     33 DE_BEGIN_EXTERN_C
     34 
     35 /* Socket types. */
     36 typedef struct deSocket_s			deSocket;
     37 typedef struct deSocketAddress_s	deSocketAddress;
     38 
     39 typedef enum deSocketFamily_e
     40 {
     41 	DE_SOCKETFAMILY_INET4 = 0,
     42 	DE_SOCKETFAMILY_INET6,
     43 
     44 	DE_SOCKETFAMILY_LAST
     45 } deSocketFamily;
     46 
     47 typedef enum deSocketType_e
     48 {
     49 	DE_SOCKETTYPE_STREAM	= 0,
     50 	DE_SOCKETTYPE_DATAGRAM,
     51 
     52 	DE_SOCKETTYPE_LAST
     53 } deSocketType;
     54 
     55 typedef enum deSocketProtocol_e
     56 {
     57 	DE_SOCKETPROTOCOL_TCP = 0,
     58 	DE_SOCKETPROTOCOL_UDP,
     59 
     60 	DE_SOCKETPROTOCOL_LAST
     61 } deSocketProtocol;
     62 
     63 typedef enum deSocketFlag_e
     64 {
     65 	DE_SOCKET_KEEPALIVE		= (1<<0),
     66 	DE_SOCKET_NODELAY		= (1<<1),
     67 	DE_SOCKET_NONBLOCKING	= (1<<2),
     68 	DE_SOCKET_CLOSE_ON_EXEC	= (1<<3)
     69 } deSocketFlag;
     70 
     71 /* \todo [2012-07-09 pyry] Separate closed bits for send and receive channels. */
     72 
     73 typedef enum deSocketState_e
     74 {
     75 	DE_SOCKETSTATE_CLOSED					= 0,
     76 	DE_SOCKETSTATE_CONNECTED				= 1,
     77 	DE_SOCKETSTATE_LISTENING				= 2,
     78 	DE_SOCKETSTATE_DISCONNECTED				= 3,
     79 
     80 	DE_SOCKETSTATE_LAST
     81 } deSocketState;
     82 
     83 typedef enum deSocketResult_e
     84 {
     85 	DE_SOCKETRESULT_SUCCESS					= 0,
     86 	DE_SOCKETRESULT_WOULD_BLOCK				= 1,
     87 	DE_SOCKETRESULT_CONNECTION_CLOSED		= 2,
     88 	DE_SOCKETRESULT_CONNECTION_TERMINATED	= 3,
     89 	DE_SOCKETRESULT_ERROR					= 4,
     90 
     91 	DE_SOCKETRESULT_LAST
     92 } deSocketResult;
     93 
     94 typedef enum deSocketChannel_e
     95 {
     96 	DE_SOCKETCHANNEL_RECEIVE	= (1<<0),
     97 	DE_SOCKETCHANNEL_SEND		= (1<<1),
     98 
     99 	DE_SOCKETCHANNEL_BOTH		= DE_SOCKETCHANNEL_RECEIVE|DE_SOCKETCHANNEL_SEND
    100 } deSocketChannel;
    101 
    102 /* Socket API, similar to Berkeley sockets. */
    103 
    104 deSocketAddress*	deSocketAddress_create		(void);
    105 void				deSocketAddress_destroy		(deSocketAddress* address);
    106 
    107 deBool				deSocketAddress_setFamily	(deSocketAddress* address, deSocketFamily family);
    108 deSocketFamily		deSocketAddress_getFamily	(const deSocketAddress* address);
    109 deBool				deSocketAddress_setType		(deSocketAddress* address, deSocketType type);
    110 deSocketType		deSocketAddress_getType		(const deSocketAddress* address);
    111 deBool				deSocketAddress_setProtocol	(deSocketAddress* address, deSocketProtocol protocol);
    112 deSocketProtocol	deSocketAddress_getProtocol	(const deSocketAddress* address);
    113 deBool				deSocketAddress_setPort		(deSocketAddress* address, int port);
    114 int					deSocketAddress_getPort		(const deSocketAddress* address);
    115 deBool				deSocketAddress_setHost		(deSocketAddress* address, const char* host);
    116 const char*			deSocketAddress_getHost		(const deSocketAddress* address);
    117 
    118 deSocket*			deSocket_create				(void);
    119 void				deSocket_destroy			(deSocket* socket);
    120 
    121 deSocketState		deSocket_getState			(const deSocket* socket);
    122 deUint32			deSocket_getOpenChannels	(const deSocket* socket);
    123 
    124 deBool				deSocket_setFlags			(deSocket* socket, deUint32 flags);
    125 
    126 deBool				deSocket_listen				(deSocket* socket, const deSocketAddress* address);
    127 deSocket*			deSocket_accept				(deSocket* socket, deSocketAddress* clientAddress);
    128 
    129 deBool				deSocket_connect			(deSocket* socket, const deSocketAddress* address);
    130 
    131 deBool				deSocket_shutdown			(deSocket* socket, deUint32 channels);
    132 deBool				deSocket_close				(deSocket* socket);
    133 
    134 deSocketResult		deSocket_send				(deSocket* socket, const void* buf, size_t bufSize, size_t* numSent);
    135 deSocketResult		deSocket_receive			(deSocket* socket, void* buf, size_t bufSize, size_t* numReceived);
    136 
    137 /* Utilities. */
    138 
    139 const char*			deGetSocketFamilyName		(deSocketFamily family);
    140 const char*			deGetSocketResultName		(deSocketResult result);
    141 
    142 DE_END_EXTERN_C
    143 
    144 #endif /* _DESOCKET_H */
    145