root/vtcross/trunk/src/lib/socketcomm/socketcomm.cpp @ 164

Revision 164, 4.5 KB (checked in by bhilburn, 15 years ago)

Added some TODOs to the following files:

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