// rc < 0 on comm failures // rc == 1 indicates comm success extern int proto_session_send_msg(Proto_Session *s, int reset) { s->shdr.blen = htonl(s->slen); // write request if (net_writen(s->fd, &(s->shdr), sizeof(s->shdr)) != sizeof(s->shdr)) return -1; if (s->slen) { if (net_writen(s->fd, s->sbuf, s->slen) != s->slen) { return -2; } } if (proto_debug()) { fprintf(stderr, "%p: proto_session_send_msg: SENT:\n", pthread_self()); proto_session_dump(s); } // communication was successfull if (reset) proto_session_reset_send(s); return 1; }
void proto_server_post_event(void) { int i; int num; pthread_mutex_lock(&Proto_Server.EventSubscribersLock); i = 0; num = Proto_Server.EventNumSubscribers; while (num > 0) { Proto_Server.EventSession.fd = Proto_Server.EventSubscribers[i]; if (Proto_Server.EventSession.fd != -1) { num--; if (proto_session_send_msg(&Proto_Server.EventSession, 0) < 0) { // must have lost an event connection close(Proto_Server.EventSession.fd); Proto_Server.EventSubscribers[i] = -1; Proto_Server.EventNumSubscribers--; Proto_Server.session_lost_handler(&Proto_Server.EventSession); } // FIXME: add ack message here to ensure that game is updated // correctly everywhere... at the risk of making server dependent // on client behaviour (use time out to limit impact... drop // clients that misbehave but be carefull of introducing deadlocks } i++; } proto_session_reset_send(&Proto_Server.EventSession); pthread_mutex_unlock(&Proto_Server.EventSubscribersLock); }
// rc < 0 on comm failures // rc == 1 indicates comm success // session passed to us contains header and body information, // need to send that information to fd extern int proto_session_send_msg(Proto_Session *s, int reset){ s->shdr.blen = htonl(s->slen); if(net_writen(s->fd, &(s->shdr), sizeof(Proto_Msg_Hdr)) < 0) return -1; net_writen(s->fd, s->sbuf, s->slen); if (proto_debug()) { fprintf(stderr, "%p: proto_session_send_msg: SENT:\n", pthread_self()); proto_session_dump(s); } if (reset) proto_session_reset_send(s); return 1; }
// rc < 0 on comm failures // rc == 1 indicates comm success extern int proto_session_send_msg(Proto_Session *s, int reset) { s->shdr.blen = htonl(s->slen); // write request ADD CODE if (proto_debug()) { fprintf(stderr, "%p: proto_session_send_msg: SENT:\n", pthread_self()); proto_session_dump(s); } // communication was successfull if (reset) proto_session_reset_send(s); return 1; }
// rc < 0 on comm failures // rc == 1 indicates comm success extern int proto_session_send_msg(Proto_Session *s, int reset) { s->shdr.blen = htonl(s->slen); // write request // ADD CODE net_writen(s->fd, &s->shdr, (int)sizeof(Proto_Msg_Hdr)); if (s->slen>0) { net_writen(s->fd, &s->sbuf, (int)s->slen); if (PROTO_PRINT_DUMPS==1) fprintf(stderr, "Sending extra bytes: %d\n", s->slen); } if (proto_debug()) { fprintf(stderr, "%p: proto_session_send_msg: SENT:\n", pthread_self()); proto_session_dump(s); } if (PROTO_PRINT_DUMPS==1) fprintf(stderr, "Sent message...\n"); // //////////// // struct sockaddr_in sinadd; // socklen_t len = sizeof(sinadd); // if (getsockname(s->fd, (struct sockaddr *)&sinadd, &len) == -1) // perror("getsockname"); // else // printf("port number %d\n", ntohs(sinadd.sin_port)); // char hostname[128]; // gethostname(hostname, sizeof hostname); // printf("My hostname: %s\n", hostname); // //////////// // communication was successfull if (reset) proto_session_reset_send(s); return 1; }
extern int proto_client_hello(Proto_Client_Handle ch) { int i = 0, rc = 1, offset = 0; Proto_Session *s; Proto_Client *c = ch; s = &(c->rpc_session); printf("Loading...\n\n"); marshall_mtonly(s, PROTO_MT_REQ_BASE_HELLO); proto_session_body_marshall_int(s,i); rc = proto_session_rpc(s); if (rc == 1) maze_unmarshall_row(s, offset, i); else c->session_lost_handler(s); if (Board.size / 20 > 0) { for (i = 1; i < Board.size / 20; i++) { proto_session_reset_send(s); marshall_mtonly(s, PROTO_MT_REQ_BASE_HELLO); proto_session_body_marshall_int(s,i); rc = proto_session_rpc(s); if (rc == 1) maze_unmarshall_row(s, 0, i); else c->session_lost_handler(s); } } //dump(); return i; }
extern int proto_session_send_msg(Proto_Session *s, int reset) { //int n; s->shdr.blen = sizeof (s->sbuf); s->slen = sizeof (s->shdr); net_writen(s->fd, &(s->shdr), s->slen); net_writen(s->fd, &(s->sbuf), s->shdr.blen); // write request // ADD CODE if (proto_debug()) { fprintf(stderr, "%p: proto_session_send_msg: SENT:\n", pthread_self()); proto_session_dump(s); } // communication was successfull if (reset) proto_session_reset_send(s); return 1; }
void proto_server_post_event(void){ int i; int num; pthread_mutex_lock(&Proto_Server.EventSubscribersLock); i = 0; num = Proto_Server.EventNumSubscribers; while (num) { Proto_Server.EventSession.fd = Proto_Server.EventSubscribers[i]; if (Proto_Server.EventSession.fd != -1) { num--; if (proto_session_send_msg(&(Proto_Server.EventSession),0)<0) { printf("Lost a connection.\n"); // must have lost an event connection close(Proto_Server.EventSession.fd); Proto_Server.EventSubscribers[i]=-1; Proto_Server.EventNumSubscribers--; // NYI; //Proto_Server.ADD CODE //I Have no idea^^ -B 4/24/13 // may have to issue a remove player for this subscriber...-chris 4/24/13 } // FIXME: add ack message here to ensure that game is updated // correctly everywhere... at the risk of making server dependent // on client behaviour (use time out to limit impact... drop // clients that misbehave but be carefull of introducing deadlocks } i++; } proto_session_reset_send(&Proto_Server.EventSession); pthread_mutex_unlock(&Proto_Server.EventSubscribersLock); }