Almost working network support.

This commit is contained in:
2008-10-09 19:20:37 +00:00
parent 7d42846db7
commit 227e1e9254
3 changed files with 138 additions and 56 deletions

View File

@@ -10,6 +10,9 @@
#include <stdlib.h>
#include <string.h>
#include <unistd.h>
#include <assert.h>
#include "net.h"
#define MAX_CLIENTS 2
#define SRV_FDS 1
@@ -18,10 +21,14 @@ int servsock;
struct pollfd pollfds[SRV_FDS+MAX_CLIENTS];
int nclients = 0;
FILE *net_side[2];
int
errx(int eval, const char *fmt, ...) {
va_list ap;
va_start(ap, fmt);
vfprintf(stderr, fmt, ap);
va_end(ap);
exit(eval);
}
@@ -31,22 +38,77 @@ net_server(int port) {
serveraddr.sin_family = AF_INET;
serveraddr.sin_addr.s_addr = htonl(INADDR_ANY);
serveraddr.sin_port = htons(port);
servsock=socket(PF_INET, SOCK_STREAM, IPPROTO_TCP);
if (servsock<0)
errx(1, "socket: %s", strerror(errno));
if (bind(servsock, (struct sockaddr *)&serveraddr, sizeof(serveraddr)) < 0)
errx(1, "bind port %d: %s", port, strerror(errno));
errx(1, "socket: %s\n", strerror(errno));
int r;
do r=bind(servsock, (struct sockaddr *)&serveraddr, sizeof(serveraddr));
while ((r<0) && (errno==EADDRINUSE));
if (r < 0)
errx(1, "bind port %d: %s\n", port, strerror(errno));
if (listen(servsock, 10) < 0)
errx(1, "listen: %s", strerror(errno));
errx(1, "listen: %s\n", strerror(errno));
#if 1
// FIXME Temporary startup. Use net_poll for this later:
printf("Waiting for connections...\n");
for (int i=0; i<2; i++) {
struct sockaddr_in clientaddr;
int cfd;
socklen_t slen;
FILE *f;
cfd=accept(servsock, (struct sockaddr *)&clientaddr, &slen);
if (cfd<0)
errx(1, "accept: %s\n", strerror(errno));
// FIXME log, shout, or something
printf("client log on...\n");
f = fdopen(cfd, "r+");
if (!f)
errx(1, "fdopen: %s\n", strerror(errno));
setlinebuf(f);
fprintf(f, "Welcome!\n");
if (i==0)
fprintf(f, "Waiting for another player...\n");
fflush(f);
net_side[i]=f;
}
net_all_printf("Starting game\n");
#else
pollfds[0].fd=servsock;
pollfds[0].events=POLLIN|POLLERR|POLLHUP;
for (int i=SRV_FDS; i<(SRV_FDS+MAX_CLIENTS); i++) {
pollfds[0].fd=-1;
pollfds[0].events=0;
}
#endif
}
void
net_all_flush() {
for (int i=0; i<2; i++)
fflush(net_side[i]);
}
void
net_all_printf(const char *fmt, ...) {
va_list ap;
va_start(ap, fmt);
for (int i=0; i<2; i++)
vfprintf(net_side[i], fmt, ap);
va_end(ap);
}
void
net_side_printf(int side, const char *fmt, ...) {
va_list ap;
assert((side==0) || (side==1));
va_start(ap, fmt);
vfprintf(net_side[side], fmt, ap);
va_end(ap);
}
void
net_poll() {