Пример #1
0
// 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;
}
Пример #2
0
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);
}
Пример #3
0
// 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;
}
Пример #4
0
// 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;
}
Пример #5
0
// 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;
}
Пример #6
0
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;
}
Пример #8
0
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);
}