repo: game
action: blob
revision: 
path_from: server/server.c
revision_from: refs/heads/master:
path_to: 
revision_to: 
git.thebackupbox.net
game
git clone git://git.thebackupbox.net/game

blob of:

game
/ server

/ server.c

blob_plain of this file

refs/heads/master:/server/server.c

 #include 
 #include 
 #include 
 #include 
 #include 
 #include 
 #include 
 #include 

 #include "../common/packet.h"

 extern struct idc_global idc;

 int listener;

 //struct pos {
 //  float x;
 //  float y;
 //  float z;
 //};

 /*
 #define MSG_POS 1
 #define MSG_ROT 2

 struct packet_c2s {
   char type;
   float x,y,z;
 };

 struct packet_s2c {
   int id;
   struct packet_c2s m;
 };
 */

 void client_handler(struct shit *,char *);

 void client_auth(struct shit *me,char *line) {
   unsigned char len;
   int i;
   char name[256];
   if(!line) {
     printf("%d disconnected\n",me->fd);
     close(me->fd);
     me->fd=-1;
     return;
   }
   read(me->fd,&len,1);
   if(len != 0) {//0 means guest login
     int rl=read(me->fd,name,len);
     if(rl != len) {
       printf("got eof from %d before we could read %d bytes for name (got %d)\n",me->fd,len,rl);
       close(me->fd);
       me->fd=-1;
       return;
     }
     name[rl]=0;
     printf("%d says they are '%s'\n",me->fd,name);
   } else {
     printf("%d is a guest.\n",me->fd);
   }
   me->line_handler=client_handler;//switch handler
 }

 void client_handler(struct shit *me,char *line) {
   int i;
   struct packet_s2c o;
   if(!line) {
    printf("%d disconnected\n",me->fd);
    close(me->fd);
    me->fd=-1;
    return;
   }
   struct packet_c2s m;
   if(read(me->fd,&m,sizeof(struct packet_c2s)) <= 0) {
     printf("%d EOF on read\n",me->fd);
     close(me->fd);
     me->fd=-1;
   }
   if(m.type == MSG_POS || m.type == MSG_ROT) {//same format, just different type
     o.id=me->fd;
     o.m=m;
     printf("%d: type: %d x:%f y:%f z:%f\n",me->fd,m.type,m.x,m.y,m.z);
     for(i=0;ifd && idc.fds[i].fd != listener) {
         write(idc.fds[i].fd,&o,sizeof(struct packet_s2c));
       }
     }
   }
 }

 void accept_connection(struct shit *me,char *line) {
   struct sockaddr_in client;
   int i;
   int len=sizeof(client);
   int s=accept(me->fd,(struct sockaddr *)&client,&len);
   printf("sock: %d\n",s);
   i=add_fd(s,client_auth);
   idc.fds[i].read_lines_for_us=0;
 }

 int main(int argc,char *argv[]) {
   listener=socket(AF_INET,SOCK_STREAM,IPPROTO_TCP);
   struct sockaddr_in sa;
   int i;
   for(i=0;i<100;i++) {
     idc.fds[i].fd=-1;
   }
   idc.shitlen=0;
   memset(&sa,0,sizeof(sa));
   sa.sin_addr.s_addr=inet_addr("0.0.0.0");
   sa.sin_port=htons(1025);
   sa.sin_family=AF_INET;
   int enable=1;
   if(setsockopt(listener,SOL_SOCKET,SO_REUSEADDR,&enable,sizeof(int)) == -1) {
     perror("setsockopt");
     return 1;
   }
   if(bind(listener,(struct sockaddr *)&sa,sizeof(sa)) == -1) {
     perror("bind");
     return 2;
   }
   if(listen(listener,0) == -1) {
     perror("listen");
     return 3;
   }
   i=add_fd(listener,accept_connection);
   idc.fds[i].read_lines_for_us=0;
   return select_on_everything();
 }