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

Revision 172, 4.4 KB (checked in by bhilburn, 15 years ago)

Updating implementation file to reflect usage of cstrings.

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