root/vtcross/branches/bhilburn/src/include/vtcross/socket_comm.h @ 147

Revision 147, 4.2 KB (checked in by bhilburn, 15 years ago)

Ported commonly used functions to the new socket_comm.h include. Bunch of TODOs
in here, and there is still some cleanup that needs to be done. I cleaned up a
lot and ported non-c++ code appropriately already, however.

Line 
1/* Virginia Tech Cognitive Radio Open Source Systems
2 * Virginia Tech, 2009
3 *
4 * TODO LICENSE INFORMATION GOES HERE
5 */
6
7/* TODO DESCRIPTION OF FILE.
8 */
9
10
11#include <cstdlib>
12#include <cstring>
13#include <netinet/in.h>
14#include <netdb.h>
15#include <stdint.h>
16#include <sys/types.h>
17#include <sys/socket.h>
18
19#include "vtcross/common.h"
20#include "vtcross/debug.h"
21#include "vtcross/error.h"
22
23
24void
25ReadMessage(int32_t socketFD, char* msgBuffer)
26{
27    ssize_t msgLength;
28   
29    msgLength = recv(socketFD, msgBuffer, 256, MSG_PEEK);
30    for(size_t i = 0; i < 256; i++) {
31            if(strcmp(&msgBuffer[i], "\0") == 0)
32            break;
33    }
34
35    msgLength = recv(socketFD, msgBuffer, i + 1, 0);
36    if (msgLength < 0)
37        ERROR(1, "Error reading from socket");
38}
39
40
41int32_t
42ClientSocket(char* serverName, char* portNumber)
43{
44    int32_t socketFD;
45    int32_t portNo;
46
47    struct sockaddr_in serv_addr;
48    struct hostent *server;
49   
50    server = gethostbyname(serverName);
51    if(server == NULL)
52        ERROR(1, "No server found by that hostname.");
53
54    portNo = atoi(portNumber);
55
56    socketFD = socket(AF_INET, SOCK_STREAM, 0);
57    if(socketFD < 0)
58        ERROR(1, "Error opening socket");
59
60    memset((void *) &serv_addr, 0, sizeof(serv_addr));
61    serv_addr.sin_family = AF_INET;
62    serv_addr.sin_port = htons(portNo);
63    memcpy((char *) &serv_addr.sin_addr.s_addr, (char *) server->h_addr, \
64            server->h_length);
65
66    if(connect(socketFD, (struct sockaddr *) &serv_addr, sizeof(serv_addr)) < 0)
67        ERROR(1, "Error connecting to remote socket.");
68
69    return socketFD;
70}
71
72   
73int32_t
74SendMessage(int32_t socketFD, char* message)
75{
76     
77    // TODO explain this. What, exactly, does the below line do and how does it
78    // affect the rest of the function?
79    strcat(message, "\0000");
80
81    ssize_t numSentBytes = send(socketFD, message, (strlen(message) + 1), 0);
82    if(numSentBytes < 0)
83        ERROR("Error sending to server.");
84    else if(numSentBytes == 0)
85        LOG("socket_comm::SendMessage - Server closed the socket.\n");
86   
87    return numSentBytes;
88}
89
90
91// TODO This function is currently returning 1... always... is this necessary?
92// If we want a fail/success return type, then why aren't we ever returning a
93// failure?
94int32_t
95GetParameter(int32_t socketFD, struct Parameter pList[], \
96        struct CE_Info *ce_info)
97{
98    char buffer[256];
99    memset(buffer, 0, 256);
100
101    ReadMessage(socketFD, buffer);
102    ce_info->numParameters = atoi(buffer);
103    LOG("socket_comm::GetParameter - Number of parameters: %d\n", \
104            ce_info->numParameters);
105   
106    for(size_t i = 0; i < ce_info->numParameters; i++) {
107        memset(buffer, 0, 256);
108        ReadMessage(socketFD, buffer);
109        LOG("socket_comm::GetParameter - Name: %s\n", buffer);
110        pList[i].name = std::string(buffer);
111   
112        memset(buffer, 0, 256);
113        ReadMessage(socketFD, buffer);
114        LOG("socket_comm::GetParameter - Units: %s\n", buffer);
115        pList[i].units = std::string(buffer);
116
117        memset(buffer, 0, 256);
118        ReadMessage(socketFD, buffer);
119        LOG("socket_comm::GetParameter - Min: %s\n", buffer);
120        pList[i].min = atof(buffer);
121   
122        memset(buffer, 0, 256);
123        ReadMessage(socketFD, buffer);
124        LOG("socket_comm::GetParameter - Max: %s\n", buffer);
125        pList[i].max = atof(buffer);
126   
127        memset(buffer, 0, 256);
128        ReadMessage(socketFD, buffer);
129        LOG("socket_comm::GetParameter - Step: %s\n", buffer);
130        pList[i].step = atof(buffer);
131   
132        memset(buffer, 0, 256);
133        ReadMessage(socketFD, buffer);
134        LOG("socket_comm::GetParameter - Value: %s\n", buffer);
135        pList[i].value = atof(buffer);
136    }
137
138    return 1;
139}
140
141
142// TODO if we are just returing fail/success here, then why not return a bool
143// instead of an entire 32 bit integer?  Seems wasteful.
144int32_t
145GetRequest(int32_t socketFD, struct Parameter pList[], struct CE_Info *ce_info)
146{
147    char buffer[256];
148    memset(buffer, 0, 256);
149   
150    ReadMessage(socketFD, buffer);
151
152    if(strcmp(buffer, "val") != 0) {
153        LOG("socket_comm::GetRequest - Unexpected control data received.\n\n");
154        return 0;
155    }
156
157    LOG("socket_comm::GetRequest - Getting parameters.\n\n");
158    GetParameter(socketFD, pList, ce_info);
159
160    return 1;
161}
162
163
Note: See TracBrowser for help on using the browser.