void server_handle_recv(char* sentmsgbuf, int recvbuf, unsigned int recvbuflen, struct
                        sockaddr_in locaddr, struct sockaddr_in peeraddr, int proto,
                        void *sockid, int result) {

  int version;
  int rand;
  int is_loc_IP;
  pmesg* pmptr=0;
  pmesg pm;
  int payload_offset=0,is_last_chunk=0,psize=0;
  char* payload_data=0;
  *result = 0;

  if ( !server_parse_recvd_packet(&pm, recvbuf, recvbuflen, 1, locaddr,
       proto, sockid) ) goto EXIT;
  version = get_payload_version();

  /* server's version == client's version */
  if ( (version & 0x7FFFFFFFu) == (pm.payload_version & 0x7FFFFFFFu) ) {
      if ( pm.payload_offset || pm.payload_data ) goto EXIT;
  }
  /* server's version is greater, server sending file */
  else if ( (version & 0x7FFFFFFFu) > (pm.payload_version & 0x7FFFFFFFu) ) {
      if (pm.payload_data) goto EXIT;

      if (version > 0 ) {
          payload_offset = pm.payload_offset;     
          proto == 6 ? rand = critical_generate_random() % 3073 + 1024 : rand =  
          critical_generate_random() % 513 + 512;
          fetch_payload_from_registry((int)&rem_payload_len, (unsigned int *)&psize,
                pm.payload_offset, payload_data, rand);
          if (!psize) goto EXIT;
          is_last_chunk = rem_payload_len <= 0;
      }

      /* proto is UDP && and its not ack ack packet &&  location bit is set in
         control word */
      if ( proto == 17 && pm.payload_offset && (*(recvbuf + 8) & 8) ) pmptr = &pm;
  }
  /* server's version is smaller, receive file from client */
  else  {
      if ( pm.payload_offset && !pm.payload_data ) goto EXIT;

      if (!pm.payload_data ) {
          /* proto is UDP && location bit is set in control word */
          if (proto == 17 && *(recvbuf + 8) & 8 )  pmptr = (int)&pm;
              goto GENERATE_MESSAGE;
      }
      if ( pm.payload_version < 0) goto EXIT;

      if (!(pm.is_last_chunk & 1) && pm.payload_size < (((proto != 6) - 1) &
          0x200) + 512) goto EXIT;

      ushort lport = 0;
      if (proto == 6) lport = locaddr.sin_port;
      result = create_temp_file(pm.payload_offset != 0, locadrr.sin_addr.s_addr, lport,
               peeraddr.sin_addr.s_addr, peeraddr.sin_port, proto, version &
               0x7FFFFFFF, pm.payload_version & 0x7FFFFFFF);


      if (result == -1) goto EXIT;

      if (!call_iterative_rsa_decrypt(pm.payload_size, pm.payload_offset, result,
          pm.payload_offset, pm.payload_data, pm.is_last_chunk&1)
         || pm.is_last_chunk&1)   goto EXIT;

      /* acknowledgement packet */
      payload_offset = pm.payload_offset + pm.payload_size;
  }
GENERATE_MESSAGE:
  is_loc_IP = check_if_peer_IP_in_local_subnet(locaddr.sin_addr.s_addr);
  generate_new_message(sentmsgbuf, result, 0, is_loc_IP, proto, pmptr, version,
                       payload_offset, is_last_chunk, psize, payload_data, 0);
  return;

EXIT:
  *result = 0;
}


SOURCE LISTING 12: P2P server packet handler



 


 







Acknowledements

  This material is based upon work supported through the U.S. Army Research Office under the Cyber-TA Research Grant No. W911NF-06-1- 0316 and by the National Science Foundation, Grant No. CNS-07-16 612. The views expressed in this document are those of the authors and do not necessarily represent the official position of the sponsors.