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

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

Fixed backwards preproc declerations in components.h and containers.h, added
them to socket_comm.h.

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