From 642bf87cfd30394d4440c531f22e61ecce5bc49d Mon Sep 17 00:00:00 2001 From: Benjamin Franzke Date: Thu, 8 Nov 2012 21:21:30 +0100 Subject: Add a very simple prisoner dilemma server --- .gitignore | 1 + Makefile | 5 +++- pd_server.c | 83 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ 3 files changed, 88 insertions(+), 1 deletion(-) create mode 100644 pd_server.c diff --git a/.gitignore b/.gitignore index 4007296..188150f 100644 --- a/.gitignore +++ b/.gitignore @@ -1,2 +1,3 @@ tit4tat prisoners_dilemma +pd_server diff --git a/Makefile b/Makefile index 9f8ad86..23902ff 100644 --- a/Makefile +++ b/Makefile @@ -1,8 +1,11 @@ -all: tit4tat prisoners_dilemma +all: pd_server tit4tat prisoners_dilemma tit4tat: tit4tat.c gcc -std=c99 -Wall -o $@ $< +pd_server: pd_server.c + gcc -o $@ $< + prisoners_dilemma: prisoners_dilemma.pl gplc -o $@ $< diff --git a/pd_server.c b/pd_server.c new file mode 100644 index 0000000..d0b2315 --- /dev/null +++ b/pd_server.c @@ -0,0 +1,83 @@ +#include +#include +#include +#include +#include +#include +#include +#include +#include + +enum { + COORPERATION = 'c', + DEFECTION = 'd' +}; + +int pay(int a, int b) +{ + if (a == COORPERATION && b == DEFECTION) return 1; + if (a == DEFECTION && b == DEFECTION) return 2; + if (a == COORPERATION && b == COORPERATION) return 3; + if (a == DEFECTION && b == COORPERATION) return 4; + + exit(EXIT_FAILURE); +} + +int +main(int argc, char *argv[]) +{ + int sock, player[2], read_fd; + struct sockaddr_in serv_addr; + int port = 8068; + int rounds, i; + int optval = 1; + + rounds = atoi(argv[1]); + + sock = socket(AF_INET, SOCK_STREAM, 0); + if (sock < 0) + return EXIT_FAILURE; + setsockopt(sock, SOL_SOCKET, SO_REUSEADDR, + &optval, sizeof optval); + serv_addr.sin_family = AF_INET; + serv_addr.sin_addr.s_addr = INADDR_ANY; + serv_addr.sin_port = htons(port); + if (bind(sock, (struct sockaddr *) &serv_addr, + sizeof(serv_addr)) < 0) { + fprintf(stderr, "Failed to bind: %s\n", + strerror(errno)); + return EXIT_FAILURE; + } + listen(sock, 2); + + for (i = 0; i < 2; ++i) { + player[i] = accept(sock, NULL, NULL); + } + int a_payment = 0, b_payment = 0; + for (i = 0; i < rounds; ++i) { + char a, b; + read(player[0], &a, 1); + read(player[1], &b, 1); + + if (a != 'c' && a != 'd') { + printf("a sent incorrect char: %c\n", a); + continue; + } + if (b != 'c' && b != 'd') { + printf("b sent incorrect char: %c\n", b); + continue; + } + + a_payment += pay(a, b); + b_payment += pay(b, a); + + printf("A [%c]: %d Euro\tB [%c]: %d Euro\t\t\tA: %d\tB: %d\n", + a, pay(a, b), b, pay(b, a), a_payment, b_payment); + + write(player[0], &b, 1); + write(player[1], &a, 1); + } + close(player[0]); + close(player[1]); + close(sock); +} -- cgit