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 130 131
|
#include <iostream>
#include <string>
#include <cstring>
#include <cstdlib>
#include <sys/socket.h>
#include <netinet/in.h>
#include <netinet/tcp.h>
#include <netdb.h>
#include <unistd.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;
}
|