root/vtcross/branches/bhilburn/src/lib/sockets/socketcomm.cpp @ 156

Revision 156, 4.3 KB (checked in by bhilburn, 15 years ago)

Reorganized the socket functions to form a static library to link against since
we will be using that code everwhere. All autofoo stuff has been updated to
reflect this. Also, implemented the old policy engine demo with our new
component classes and fixed some bugs in that design.

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