Network code updated. (simplest solution possible)
It works!
This commit is contained in:
parent
ea727f335a
commit
c606818adc
130
src/net.c
130
src/net.c
@ -32,6 +32,16 @@ errx(int eval, const char *fmt, ...) {
|
|||||||
exit(eval);
|
exit(eval);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
struct file {
|
||||||
|
int fd;
|
||||||
|
char ibuf[BUFSIZ];
|
||||||
|
char obuf[BUFSIZ];
|
||||||
|
int istart;
|
||||||
|
int iend;
|
||||||
|
int oend;
|
||||||
|
} sfile[2];
|
||||||
|
|
||||||
|
|
||||||
void
|
void
|
||||||
net_server(int port) {
|
net_server(int port) {
|
||||||
struct sockaddr_in serveraddr;
|
struct sockaddr_in serveraddr;
|
||||||
@ -44,34 +54,30 @@ net_server(int port) {
|
|||||||
if (servsock<0)
|
if (servsock<0)
|
||||||
errx(1, "socket: %s\n", strerror(errno));
|
errx(1, "socket: %s\n", strerror(errno));
|
||||||
int r;
|
int r;
|
||||||
do r=bind(servsock, (struct sockaddr *)&serveraddr, sizeof(serveraddr));
|
do {
|
||||||
while ((r<0) && (errno==EADDRINUSE));
|
r=bind(servsock, (struct sockaddr *)&serveraddr, sizeof(serveraddr));
|
||||||
|
serveraddr.sin_port = htons(port++);
|
||||||
|
} while ((r<0) && (errno==EADDRINUSE));
|
||||||
if (r < 0)
|
if (r < 0)
|
||||||
errx(1, "bind port %d: %s\n", port, strerror(errno));
|
errx(1, "bind port %d: %s\n", port, strerror(errno));
|
||||||
if (listen(servsock, 10) < 0)
|
if (listen(servsock, 10) < 0)
|
||||||
errx(1, "listen: %s\n", strerror(errno));
|
errx(1, "listen: %s\n", strerror(errno));
|
||||||
#if 1
|
#if 1
|
||||||
// FIXME Temporary startup. Use net_poll for this later:
|
// FIXME Temporary startup. Use net_poll for this later:
|
||||||
printf("Waiting for connections...\n");
|
printf("Waiting for connections on port %d...\n", port-1);
|
||||||
for (int i=0; i<2; i++) {
|
for (int i=0; i<2; i++) {
|
||||||
struct sockaddr_in clientaddr;
|
struct sockaddr_in clientaddr;
|
||||||
int cfd;
|
int cfd;
|
||||||
socklen_t slen;
|
socklen_t slen;
|
||||||
FILE *f;
|
|
||||||
cfd=accept(servsock, (struct sockaddr *)&clientaddr, &slen);
|
cfd=accept(servsock, (struct sockaddr *)&clientaddr, &slen);
|
||||||
if (cfd<0)
|
if (cfd<0)
|
||||||
errx(1, "accept: %s\n", strerror(errno));
|
errx(1, "accept: %s\n", strerror(errno));
|
||||||
// FIXME log, shout, or something
|
// FIXME log, shout, or something
|
||||||
printf("client log on...\n");
|
printf("client log on...\n");
|
||||||
f = fdopen(cfd, "r+");
|
sfile[i].fd=cfd;
|
||||||
if (!f)
|
net_side_printf(i, "Welcome!\n");
|
||||||
errx(1, "fdopen: %s\n", strerror(errno));
|
|
||||||
setlinebuf(f);
|
|
||||||
fprintf(f, "Welcome!\n");
|
|
||||||
if (i==0)
|
if (i==0)
|
||||||
fprintf(f, "Waiting for another player...\n");
|
net_side_printf(i, "Waiting for another player...\n");
|
||||||
fflush(f);
|
|
||||||
net_side[i]=f;
|
|
||||||
}
|
}
|
||||||
net_all_printf("Starting game\n");
|
net_all_printf("Starting game\n");
|
||||||
#else
|
#else
|
||||||
@ -84,10 +90,102 @@ net_server(int port) {
|
|||||||
#endif
|
#endif
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
#if 1
|
||||||
|
int
|
||||||
|
net_getc(int side) {
|
||||||
|
char c;
|
||||||
|
int n;
|
||||||
|
assert(side==0 || side==1);
|
||||||
|
n=read(sfile[side].fd, &c, 1);
|
||||||
|
if (n<0) return -1;
|
||||||
|
return c;
|
||||||
|
}
|
||||||
|
void
|
||||||
|
net_all_flush() {
|
||||||
|
}
|
||||||
|
|
||||||
|
void
|
||||||
|
net_side_printf(int side, const char *fmt, ...) {
|
||||||
|
va_list ap;
|
||||||
|
char buf[BUFSIZ];
|
||||||
|
int len, n;
|
||||||
|
assert((side==0) || (side==1));
|
||||||
|
va_start(ap, fmt);
|
||||||
|
len=vsnprintf(buf, sizeof(buf)-1, fmt, ap);
|
||||||
|
va_end(ap);
|
||||||
|
if (len > BUFSIZ-1)
|
||||||
|
errx(1, "BUFSIZ too small\n");
|
||||||
|
char *bufp=buf;
|
||||||
|
do {
|
||||||
|
n=write(sfile[side].fd, bufp, len);
|
||||||
|
if (n<0)
|
||||||
|
errx(1, "write: %s\n", strerror(errno));
|
||||||
|
bufp+=n;
|
||||||
|
} while (bufp < buf+len);
|
||||||
|
}
|
||||||
|
|
||||||
|
void
|
||||||
|
net_all_printf(const char *fmt, ...) {
|
||||||
|
va_list ap;
|
||||||
|
char buf[BUFSIZ];
|
||||||
|
int len, n;
|
||||||
|
va_start(ap, fmt);
|
||||||
|
len=vsnprintf(buf, sizeof(buf)-1, fmt, ap);
|
||||||
|
va_end(ap);
|
||||||
|
if (len > BUFSIZ-1)
|
||||||
|
errx(1, "BUFSIZ too small\n");
|
||||||
|
for (int side=0; side<2; side++) {
|
||||||
|
char *bufp=buf;
|
||||||
|
do {
|
||||||
|
n=write(sfile[side].fd, bufp, len);
|
||||||
|
if (n<0)
|
||||||
|
errx(1, "write: %s\n", strerror(errno));
|
||||||
|
bufp+=n;
|
||||||
|
} while (bufp < buf+len);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
#else
|
||||||
|
#define net_getc2(f) (f.iend<BUFSIZ||net_fillbuf(f), f.ibuf[f.iend++])
|
||||||
|
#define net_getc(side) net_getc2(sfile[side])
|
||||||
|
|
||||||
|
void
|
||||||
|
net_fillbuf(struct file f) {
|
||||||
|
n=read(f.fd, f.ibuf, BUFSIZ);
|
||||||
|
if (n==0)
|
||||||
|
errx(1, "end of file\n");
|
||||||
|
if (n<0)
|
||||||
|
errx(1, "read: %s\n", strerror(errno));
|
||||||
|
f.iend=n;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
void
|
||||||
|
net_side_flush(int side) {
|
||||||
|
start=0;
|
||||||
|
do start+=write(fd[side], obuf[side]+start, obufend);
|
||||||
|
while (start < obufend);
|
||||||
|
}
|
||||||
|
|
||||||
void
|
void
|
||||||
net_all_flush() {
|
net_all_flush() {
|
||||||
for (int i=0; i<2; i++)
|
for (int i=0; i<2; i++)
|
||||||
fflush(net_side[i]);
|
net_side_flush(i);
|
||||||
|
}
|
||||||
|
|
||||||
|
static void
|
||||||
|
net_side_vprintf(int side, const char *fmt, va_list ap) {
|
||||||
|
n=vsnprintf(obuf[side], BUFSIZ-obufend, fmt, ap);
|
||||||
|
if (n > (BUFSIZ-obufend-1)) {
|
||||||
|
if (n > BUFSIZ-1)
|
||||||
|
errx(1, "BUFSIZ too small\n");
|
||||||
|
net_side_flush(side);
|
||||||
|
n=vsnprintf(obuf[side], BUFSIZ-obufend, fmt, ap);
|
||||||
|
}
|
||||||
|
obufend[side]+=n;
|
||||||
}
|
}
|
||||||
|
|
||||||
void
|
void
|
||||||
@ -95,7 +193,7 @@ net_all_printf(const char *fmt, ...) {
|
|||||||
va_list ap;
|
va_list ap;
|
||||||
va_start(ap, fmt);
|
va_start(ap, fmt);
|
||||||
for (int i=0; i<2; i++)
|
for (int i=0; i<2; i++)
|
||||||
vfprintf(net_side[i], fmt, ap);
|
net_side_vprintf(i, fmt, ap);
|
||||||
va_end(ap);
|
va_end(ap);
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -104,10 +202,10 @@ net_side_printf(int side, const char *fmt, ...) {
|
|||||||
va_list ap;
|
va_list ap;
|
||||||
assert((side==0) || (side==1));
|
assert((side==0) || (side==1));
|
||||||
va_start(ap, fmt);
|
va_start(ap, fmt);
|
||||||
vfprintf(net_side[side], fmt, ap);
|
net_side_vprintf(side, fmt, ap);
|
||||||
va_end(ap);
|
va_end(ap);
|
||||||
}
|
}
|
||||||
|
#endif
|
||||||
|
|
||||||
|
|
||||||
void
|
void
|
||||||
|
@ -5,12 +5,10 @@
|
|||||||
|
|
||||||
#include <stdio.h>
|
#include <stdio.h>
|
||||||
|
|
||||||
extern FILE *net_side[2];
|
|
||||||
|
|
||||||
#define net_getc(side) getc(net_side[i])
|
|
||||||
|
|
||||||
extern void net_server(int port);
|
extern void net_server(int port);
|
||||||
|
|
||||||
|
extern int net_getc(int side);
|
||||||
extern void net_all_printf(const char *fmt, ...);
|
extern void net_all_printf(const char *fmt, ...);
|
||||||
extern void net_side_printf(int side, const char *fmt, ...);
|
extern void net_side_printf(int side, const char *fmt, ...);
|
||||||
extern void net_all_flush();
|
extern void net_all_flush();
|
||||||
|
Reference in New Issue
Block a user