Files
fail/core/tests/client.cc
hsc b70b6fb43a another directory rename: failstar -> fail
"failstar" sounds like a name for a cruise liner from the 80s.  As "*" isn't a
desirable part of directory names, just name the whole thing "fail/", the core
parts being stored in "fail/core/".

Additionally fixing two build system dependency issues:
 - missing jobserver -> protomessages dependency
 - broken bochs -> fail dependency (add_custom_target DEPENDS only allows plain
   file dependencies ... cmake for the win)


git-svn-id: https://www4.informatik.uni-erlangen.de/i4svn/danceos/trunk/devel/fail@956 8c4709b5-6ec9-48aa-a5cd-a96041d1645a
2012-03-08 19:43:02 +00:00

111 lines
2.7 KiB
C++

#include <iostream>
#include "jobserver/messagedefs/FailControlMessage.pb.h"
#include "jobserver/SocketComm.hpp"
#include "experiments/AnExperiment/AnExperiment.pb.h"
#include <stdio.h>
using namespace std;
void error(const char *s)
{
perror(s);
exit(0);
}
template <typename Message>
Message *get_job(int sockfd)
{
Message *msg = new Message;
FailControlMessage ctrlmsg;
ctrlmsg.set_command(FailControlMessage_Command_NEED_WORK);
ctrlmsg.set_build_id(42);
cout << "Sending need work msg: " << ctrlmsg.build_id() << ", Command: " << ctrlmsg.command() << endl;
fi::SocketComm::send_msg(sockfd, ctrlmsg);
cout << "sent ctrl message." << endl;
fi::SocketComm::rcv_msg(sockfd, ctrlmsg);
cout << "Received ctrl message: " << ctrlmsg.command() << endl;
switch(ctrlmsg.command()){
case FailControlMessage_Command_DIE: return 0;
case FailControlMessage_Command_WORK_FOLLOWS:
fi::SocketComm::rcv_msg(sockfd, *msg);
return msg;
default:
cerr << "wtf?" << endl;
}
return 0;
}
template <typename Message>
void return_result(int sockfd, Message *msg)
{
FailControlMessage ctrlmsg;
ctrlmsg.set_command(FailControlMessage_Command_RESULT_FOLLOWS);
ctrlmsg.set_build_id(42);
cout << "Sending Result msg: " << ctrlmsg.build_id() << ", Command: " << ctrlmsg.command() << endl;
fi::SocketComm::send_msg(sockfd, ctrlmsg);
fi::SocketComm::send_msg(sockfd, *msg);
delete msg;
}
int main(int argc, char **argv){
int portno;
struct hostent *server;
cout << "JobClient" << endl;
if (argc < 3) {
cerr << "usage: " << argv[0] << " hostname port" << endl;
return 1;
}
portno = atoi(argv[2]);
server = gethostbyname(argv[1]);
if (server == NULL) {
cerr << "cannot resolve host " << argv[1] << endl;
return 1;
}
int i = 1;
while (1) {
int sockfd;
struct sockaddr_in serv_addr;
cout << ">>>>>>>>>Durchgang " << i++ << endl;
sockfd = socket(AF_INET, SOCK_STREAM, 0);
if (sockfd < 0) {
error("socket()");
}
memset(&serv_addr, 0, sizeof(serv_addr));
serv_addr.sin_family = AF_INET;
memcpy(&serv_addr.sin_addr.s_addr, server->h_addr, server->h_length);
serv_addr.sin_port = htons(portno);
if (connect(sockfd, (sockaddr *)&serv_addr, sizeof(serv_addr)) < 0) {
error("connect()");
}
MHTestData *msg = get_job<MHTestData>(sockfd);
if(!msg){
break;
close(sockfd);
}
cout << "[Minion] received job input: " << msg->input() << endl;
cout << "[Minion] Calculating " << msg->input() << "^2 = " << msg->input() * msg->input() << endl;
msg->set_output(msg->input() * msg->input());
sleep(1);
cout << "[Minion] returning result: " << msg->output() << endl;
return_result<MHTestData>(sockfd, msg);
close(sockfd);
}
cout << "ByeBye" << endl;
return 0;
}