doorbell
diff doorbelld/src/srv.c @ 4:08ea0abdbb8a
argument parsing
author | John Tsiombikas <nuclear@member.fsf.org> |
---|---|
date | Mon, 14 Mar 2016 04:20:59 +0200 |
parents | d3f2a2b19504 |
children | f21ae31ef0e7 |
line diff
1.1 --- a/doorbelld/src/srv.c Sun Mar 13 07:56:26 2016 +0200 1.2 +++ b/doorbelld/src/srv.c Mon Mar 14 04:20:59 2016 +0200 1.3 @@ -10,6 +10,8 @@ 1.4 #include "srv.h" 1.5 #include "dynarr.h" 1.6 1.7 +/* TODO convert this whole thing to multicast */ 1.8 + 1.9 static int lis_sock = -1, max_socket = -1; 1.10 static int *csock; 1.11 1.12 @@ -45,6 +47,7 @@ 1.13 lis_sock = -1; 1.14 return -1; 1.15 } 1.16 + listen(lis_sock, 8); 1.17 1.18 return 0; 1.19 } 1.20 @@ -84,16 +87,19 @@ 1.21 if(s == lis_sock) { 1.22 /* incoming connection */ 1.23 struct sockaddr_in addr; 1.24 - int addr_size; 1.25 - 1.26 - if((s = accept(lis_sock, (struct sockaddr*)&addr, (int*)&addr_size)) == -1) { 1.27 - fprintf(stderr, "%s: failed to accept incoming connection\n", __func__); 1.28 + socklen_t addr_size = sizeof addr; 1.29 + if((s = accept(lis_sock, (struct sockaddr*)&addr, &addr_size)) == -1) { 1.30 + fprintf(stderr, "%s: failed to accept incoming connection: %s\n", __func__, strerror(errno)); 1.31 return -1; 1.32 } 1.33 printf("%s: incoming connection from %s:%d\n", __func__, 1.34 inet_ntoa(addr.sin_addr), ntohs(addr.sin_port)); 1.35 csock = dynarr_push(csock, &s); 1.36 assert(csock); 1.37 + if(s > max_socket) { 1.38 + max_socket = s; 1.39 + } 1.40 + fcntl(s, F_SETFD, fcntl(s, F_GETFD) | O_NONBLOCK); 1.41 return 0; 1.42 } 1.43 1.44 @@ -101,23 +107,44 @@ 1.45 while((sz = read(s, buf, sizeof buf - 1)) > 0) { 1.46 printf("%s: got data: %s\n", __func__, buf); 1.47 } 1.48 - if(sz < 0 && errno != EAGAIN) { 1.49 + if(sz <= 0 && errno != EAGAIN) { 1.50 /* client closed connection probably */ 1.51 int i, num_clients = dynarr_size(csock); 1.52 printf("%s: removing client\n", __func__); 1.53 close(s); 1.54 + max_socket = lis_sock; 1.55 for(i=0; i<num_clients; i++) { 1.56 if(csock[i] == s) { 1.57 csock[i] = csock[num_clients - 1]; 1.58 - csock = dynarr_pop(csock); 1.59 - break; 1.60 + } 1.61 + if(csock[i] > max_socket) { 1.62 + max_socket = csock[i]; 1.63 } 1.64 } 1.65 - assert(i < num_clients); 1.66 + 1.67 + csock = dynarr_pop(csock); 1.68 + --num_clients; 1.69 } 1.70 return 0; 1.71 } 1.72 1.73 +struct video_block { 1.74 + int frame; 1.75 + int x, y; 1.76 + int width, height; 1.77 + char pixels[1]; 1.78 +}; 1.79 +#define VBLOCK_HEADER_SIZE (offsetof(struct video_block, pixels)) 1.80 + 1.81 void srv_send_frame(unsigned char *frame, int xsz, int ysz) 1.82 { 1.83 + static unsigned char *buffer; 1.84 + struct video_block *vblock; 1.85 + 1.86 + /* for now just send a big block */ 1.87 + if(!buffer && !(buffer = malloc(xsz * ysz * 2) + VBLOCK_HEADER_SIZE)) { 1.88 + fprintf(stderr, "failed to allocate frame send buffer\n"); 1.89 + return; 1.90 + } 1.91 + vblock = buffer; 1.92 }