1 /** Class IoTSocket is a base class for IoTSocketServer.cpp
2 * and IoTSocketClient.cpp that provide interfaces to connect
3 * to either Java or C++ socket endpoint
5 * Adapted from Java/C++ socket implementation
7 * @see <a href="https://www.keithv.com/software/socket/</a>
9 * @author Rahmadi Trimananda <rtrimana @ uci.edu>
13 #ifndef _IOTSOCKET_HPP__
14 #define _IOTSOCKET_HPP__
16 // Adds in the send/recv acks after each message.
19 static const int SOCKET_BUFF_SIZE = 64000;
20 // Before, it was too short as we were just using 1 byte to receive the length
21 // Now, we allocate 4 bytes (a size of integer) to receive the message length
22 static const int MSG_LEN_SIZE = 4;
28 #include <sys/types.h>
30 #include <netinet/in.h>
32 #include <sys/socket.h>
36 // Duplicated from winsock2.h
37 #define SD_RECEIVE 0x00
44 IoTSocket(int iPort, bool* pResult);
47 bool close(); // Close the socket
48 bool sendBytes(char* pVals, int _iLen); // Send a set of bytes
49 char* receiveBytes(char* pVals, int* len); // Receive a set of bytes
52 int m_iPort; // Port I'm listening on
53 int m_iSock; // Socket connection
54 struct sockaddr_in m_addrRemote; // Connector's address information
55 double* m_pBuffer; // Reuse the same memory for buffer
64 IoTSocket::IoTSocket(int iPort, bool* pResult) {
70 // Allocate our temporary buffers that are used to convert data types
71 m_pBuffer = (double *) malloc(sizeof(double) * SOCKET_BUFF_SIZE);
73 perror("IoTSocket: Failed to malloc buffer!");
81 IoTSocket::~IoTSocket() {
90 // Send bytes over the wire
91 bool IoTSocket::sendBytes(char* pVals, int _iLen) {
98 if (send(m_iSock, size, MSG_LEN_SIZE, 0) == -1) {
99 perror("IoTSocket: Send size error!");
103 if (send(m_iSock, (char *) pVals, iLen, 0) == -1) {
104 perror("IoTSocket: Send bytes error!");
118 // Receive bytes, returns number of bytes received
119 // Generate an array of char on the heap and return it
120 char* IoTSocket::receiveBytes(char* pVals, int* len)
133 while ((iTotal < 1) && (iResult != -1)) {
134 iResult = recv(m_iSock, size, MSG_LEN_SIZE, 0);
138 perror("IoTSocket: Receive size error!");
143 // To be returned from this method...
145 pVals = new char[iLen];
146 pTemp = (char *) m_pBuffer;
147 // We receiving the incoming ints one byte at a time.
149 if ((iNumBytes = recv(m_iSock, pTemp, SOCKET_BUFF_SIZE, 0)) == -1) {
150 perror("IoTSocket: Receive error!");
153 for (i = 0; i < iNumBytes; i++) {
157 iTotalBytes += iNumBytes;
158 if (iTotalBytes == iLen)
171 // Shut down the socket
172 bool IoTSocket::close()
174 if (shutdown(m_iSock, SD_BOTH) == -1) {
175 perror("IoTSocket: Close error!");
183 // Receive a short ack from the client
184 bool IoTSocket::receiveAck()
189 while ((iTotal < 1) && (iResult != -1)) {
191 iResult = recv(m_iSock, temp, 1, 0);
196 perror("IoTSocket: ReceiveAck error!");
204 // Send a short ack to the client
205 bool IoTSocket::sendAck()
210 if (send(m_iSock, temp, 1, 0) == -1)