repo: game action: blob revision: path_from: server/server.c revision_from: refs/heads/master: path_to: revision_to:
blob of:
/ server.c
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;i fd && 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(); }