root/vtcross/branches/trnewman/CR_shell/src/main_cognitive_engine.cpp @ 73

Revision 73, 7.7 KB (checked in by ahe, 16 years ago)

minor modification of socket

RevLine 
[67]1#include <stdio.h>
2#include <sys/types.h>
3#include <sys/socket.h>
4#include <netinet/in.h>
5#include <netdb.h>
6#include <iostream>
7
8using namespace std;
9
10struct CE_Info {
11    int numUtilities;
12    int numParameters;
13    int numObservables;
14};
15
16struct Utility {
[69]17    char name[50];
18    char units[50];
19    char goal[50];
[67]20   /* string name;
21    string units;
22    string goal;*/
23    float target;
24};
25
26struct Affect {
[71]27    Utility u;
[67]28    //string relation;
[71]29    char relation[50];
[67]30};     
31
32struct Parameter {
33    /*string name;
34    string units;*/
[69]35    char name[50];
36    char units[50];
[67]37    float min;
38    int numAffects;
39    Affect affection_list[10];
40    float max;
41    float step;
42};     
43       
44struct Observable {
45    //string name;
[69]46    char name[50];
[67]47    Affect affection_list[10];
48    int numAffects;
49};
50
51// error handling
52void error(char *msg)
53{
54    perror(msg);
55    exit(0);
56}
57
[70]58void ReadMessage(int socket,char * buffer) {
59    int i,n;
60
61    n = recv(socket,buffer,256,MSG_PEEK);
62    for(i=0;i<256;i++){
[71]63            if(strcmp(&buffer[i],"\0") == 0) break;
[70]64    }
65    n = recv(socket,buffer,i+1,0);
66    if (n < 0)
67         error("ERROR reading from socket");
[71]68//    printf("ReadMessage:%s %d\n",buffer,n);
[70]69}
70
[73]71int GetXMLFromServer(int sockfd, Utility uList[], Parameter pList[],
72        Observable oList[], CE_Info *ce_info)
[67]73{
74    char buffer[256];
[73]75    int i,j;
[67]76
77    // read unitilities
78    // numUtilities
79    bzero(buffer,256);
[70]80    ReadMessage(sockfd,buffer);
[73]81    ce_info->numUtilities = atoi(buffer);
82    printf("number of utilities: %d\n", ce_info->numUtilities);
[67]83       
[73]84    for (i = 0; i < ce_info->numUtilities; i++){
[67]85        bzero(buffer,256);
[71]86            ReadMessage(sockfd,buffer);
87            printf("Name: %s\n", buffer);
[70]88        strcpy(uList[i].name, buffer);
[68]89                 
90        bzero(buffer,256);
[71]91            ReadMessage(sockfd,buffer);
92            printf("Units: %s\n", buffer);
[70]93        strcpy(uList[i].units, buffer);
[68]94
[70]95        bzero(buffer,256);
[71]96            ReadMessage(sockfd,buffer);
[70]97        printf("Goal: %s\n", buffer);
98        strcpy(uList[i].goal, buffer);
[68]99       
[71]100            bzero(buffer,256);
101            ReadMessage(sockfd,buffer);
[70]102        printf("Target: %s\n", buffer);
103        uList[i].target = atof(buffer);
[67]104    }
105
[71]106    // read parameters
107    // numParameters
108    bzero(buffer,256);
109    ReadMessage(sockfd,buffer);
[73]110    ce_info->numParameters = atoi(buffer);
111    printf("number of parameters: %d\n", ce_info->numParameters);
[71]112       
[73]113    for (i = 0; i < ce_info->numParameters; i++){
[71]114        bzero(buffer,256);
115            ReadMessage(sockfd,buffer);
116            printf("Name: %s\n", buffer);
117        strcpy(pList[i].name, buffer);
118                 
119        bzero(buffer,256);
120            ReadMessage(sockfd,buffer);
121            printf("Units: %s\n", buffer);
122        strcpy(pList[i].units, buffer);
[67]123
[71]124        bzero(buffer,256);
125            ReadMessage(sockfd,buffer);
126        printf("Min: %s\n", buffer);
127        pList[i].min = atof(buffer);
128       
129        bzero(buffer,256);
130            ReadMessage(sockfd,buffer);
131        printf("Max: %s\n", buffer);
132        pList[i].max = atof(buffer);
133       
134            bzero(buffer,256);
135            ReadMessage(sockfd,buffer);
136        printf("Step: %s\n", buffer);
137        pList[i].step = atof(buffer);
138   
139        // numAffects
140        bzero(buffer,256);
141        ReadMessage(sockfd,buffer);
142        pList[i].numAffects = atoi(buffer);
143        printf("number of affects: %d\n", pList[i].numAffects);
144       
145        for (j = 0; j < pList[i].numAffects; j++){
146            bzero(buffer,256);
147                ReadMessage(sockfd,buffer);
148                printf("Utility name: %s\n", buffer);
149            strcpy(pList[i].affection_list[j].u.name, buffer);
150                 
151            bzero(buffer,256);
152                ReadMessage(sockfd,buffer);
153                printf("Relation: %s\n", buffer);
154            strcpy(pList[i].affection_list[j].relation, buffer);
155        }
[67]156
[71]157    }
158   
159    // read obervables
160    // numParameters
161    bzero(buffer,256);
162    ReadMessage(sockfd,buffer);
[73]163    ce_info->numObservables = atoi(buffer);
164    printf("number of observables: %d\n", ce_info->numObservables);
[71]165       
[73]166    for (i = 0; i < ce_info->numObservables; i++){
[71]167        bzero(buffer,256);
168            ReadMessage(sockfd,buffer);
169            printf("Name: %s\n", buffer);
170        strcpy(pList[i].name, buffer);
171                 
172        // numAffects
173        bzero(buffer,256);
174        ReadMessage(sockfd,buffer);
175        oList[i].numAffects = atoi(buffer);
176        printf("number of affects: %d\n", oList[i].numAffects);
177       
178        for (j = 0; j < oList[i].numAffects; j++){
179            bzero(buffer,256);
180                ReadMessage(sockfd,buffer);
181                printf("Utility name: %s\n", buffer);
182            strcpy(oList[i].affection_list[j].u.name, buffer);
183                 
184            bzero(buffer,256);
185                ReadMessage(sockfd,buffer);
186                printf("Relation: %s\n", buffer);
187            strcpy(oList[i].affection_list[j].relation, buffer);
188        }
189    }
190
[73]191    printf("xml reception done\n");
[71]192   
[73]193    return 0;
194}
[71]195
[73]196void print_current_config(Utility * uList[], Parameter * pList[],
197        Observable * oList[], CE_Info * ce_info)
198{   
199    int i = 0;
200    int j = 0;
[71]201
[73]202    // utilities
203    for(i = 0; i < ce_info->numUtilities ; i++) {
204        cout << "Utility:  " << uList[i]->name << endl;
205        cout << "     Units:  " << uList[i]->units << endl;
206        cout << "     Goal:   " << uList[i]->goal << endl;
207        cout << "     Target: " << uList[i]->target << endl;
208    }
209                       
210    // parameters                       
211    for(i = 0; i < ce_info->numParameters; i++) {
212        cout << "Parameter:  " << pList[i]->name << endl;
213        cout << "       Units:   " << pList[i]->units << endl;
214        cout << "       Min:     " << pList[i]->min << endl;
215        cout << "       Max:     " << pList[i]->max << endl;
216        cout << "       Step:    " << pList[i]->step << endl;
217        for(j = 0; j < pList[i]->numAffects; j++) {
218            cout << "       Affect: " << pList[i]->affection_list[j].u.name << " -> " << pList[i]->affection_list[j].relation << endl;
219        }
220    }
221
222    // observables
223    for(i = 0; i < ce_info->numObservables; i++) {
224        cout << "Observable:  " << oList[i]->name << endl;
225        for(j = 0; j < oList[i]->numAffects; j++) {
226            cout << "       Affect: " << oList[i]->affection_list[j].u.name << " -> " << oList[i]->affection_list[j].relation << endl;
227        }
228    }
229}
230
231
232// main client socket
233int main(int argc, char *argv[])
234{
235    Utility uList[10];
236    Parameter pList[10];
237    Observable oList[10];
238    CE_Info ce_info;
239
240    int sockfd, portno;
241    struct sockaddr_in serv_addr;
242    struct hostent *server;
243
244    // setup client socket connection
245    if (argc < 3) {
246       fprintf(stderr,"usage: %s hostname port\n", argv[0]);
247       exit(0);
248    }
249    // server name
250    server = gethostbyname(argv[1]);
251    if (server == NULL) {
252        fprintf(stderr,"ERROR, no such host\n");
253        exit(0);
254    }
255    // port no.
256    portno = atoi(argv[2]);
257    // socket file descriptor
258    sockfd = socket(AF_INET, SOCK_STREAM, 0);
259    if (sockfd < 0)
260        error("ERROR opening socket");
261    // initiate struct socketaddr_in
262    bzero((char *) &serv_addr, sizeof(serv_addr));
263    serv_addr.sin_family = AF_INET;
264    serv_addr.sin_port = htons(portno);
265    bcopy((char *)server->h_addr,
266         (char *)&serv_addr.sin_addr.s_addr,
267         server->h_length);
268    // cast sockaddr_in to sockaddr
269    if (connect(sockfd,(struct sockaddr *)&serv_addr,sizeof(serv_addr)) < 0)
270        error("ERROR connecting");
271   
272    // get xml info from server
273    GetXMLFromServer(sockfd, uList, pList, oList, &ce_info);
274
275    printf("utility:\n name: %s, units: %s, goal: %s, target: %f\n",
276            uList[0].name, uList[0].units, uList[0].goal, uList[0].target);
277   
278    //print_current_config(&uList, &pList, &oList, &ce_info);
279
280
[71]281  return 0;
[67]282}
Note: See TracBrowser for help on using the browser.