forked from VowpalWabbit/vowpal_wabbit
-
Notifications
You must be signed in to change notification settings - Fork 0
/
active_interactor.cc
130 lines (119 loc) · 2.97 KB
/
active_interactor.cc
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
#include <iostream>
#include <string>
#include <cstring>
#include <cstdlib>
#include <sys/socket.h>
#include <netinet/in.h>
#include <netinet/tcp.h>
#include <netdb.h>
using std::cin;
using std::endl;
using std::cout;
using std::cerr;
using std::string;
int open_socket(const char* host, unsigned short port)
{
hostent* he;
he = gethostbyname(host);
if (he == NULL)
{
cerr << "can't resolve hostname: " << host << endl;
exit(1);
}
int sd = socket(PF_INET, SOCK_STREAM, 0);
if (sd == -1)
{
cerr << "can't get socket " << endl;
exit(1);
}
sockaddr_in far_end;
far_end.sin_family = AF_INET;
far_end.sin_port = htons(port);
far_end.sin_addr = *(in_addr*)(he->h_addr);
memset(&far_end.sin_zero, '\0',8);
if (connect(sd,(sockaddr*)&far_end, sizeof(far_end)) == -1)
{
cerr << "can't connect to: " << host << ':' << port << endl;
exit(1);
}
return sd;
}
int recvall(int s, char* buf, int n){
int total=0;
int ret=recv(s, buf, n, 0);
while(ret>0 && total<n){
total+=ret;
if(buf[total-1]=='\n')
break;
ret=recv(s, buf+total, n, 0);
}
return total;
}
int main(int argc, char* argv[]){
char buf[256];
char* toks,*ptok,*ttok,*itok;
const char* host="localhost";
unsigned short port=~0;
ssize_t pos;
int s,ret,queries=0;
string line;
if(argc>1){
host = argv[1];
}
if(argc>2){
port=atoi(argv[2]);
}
if(port <= 1024 || port==(unsigned short)(~0)){
port = 26542;
}
s=open_socket(host, port);
size_t id=0;
ret=send(s,&id,sizeof(id),0);
if(ret<0){
cerr << "Could not perform handshake!" << endl;
exit(1);
}
while(getline(cin,line)){
line.append("\n");
int len=line.size();
const char* cstr = line.c_str();
const char* sp = strchr(cstr,' ');
ret=send(s,sp,len-(sp-cstr),0);
if(ret<0){
cerr << "Could not send unlabeled data!" << endl;
exit(1);
}
ret=recvall(s, buf, 256);
if(ret<0){
cerr << "Could not receive queries!" << endl;
exit(1);
}
buf[ret]='\0';
toks=&buf[0];
ptok=strsep(&toks," ");
ttok=strsep(&toks," ");
itok=strsep(&toks,"\n");
if(itok==NULL || itok[0]=='\0'){
continue;
}
queries+=1;
string imp=string(itok)+" |";
pos = line.find_first_of ("|");
line.replace(pos,1,imp);
cstr = line.c_str();
len = line.size();
ret = send(s,cstr,len,0);
if(ret<0){
cerr << "Could not send labeled data!" << endl;
exit(1);
}
ret=recvall(s, buf, 256);
if(ret<0){
cerr << "Could not receive predictions!" << endl;
exit(1);
}
}
close(s);
cout << "Went through the data by doing " << queries << " queries" << endl;
return 0;
}