ctype {
sockaddr addr1; // 16 bytes
sockaddr addr2; // 16 bytes
char* buf;
int buflen;
}  connect_struct;


void udp_checkIP_send_recv(SOCKET sock, ctype connec_stuct* a2, int local_peer) {
   int result;
   unsigned int msglen;
   struct sockaddr_in locaddr;
   struct sockaddr_in peeraddr;
   char recvmsgbuf;
   char sentmsgbuf;

   if (is_legit_ip_address(a2->addr1.sin_addr) &&   
       call_check_IP_is_in_ranges(a2->addr1.sin_addr) ) {
       result = 0;
       for ( i = 0; i < 3; ++i ) {
           result = call_select_and_sendto(10, sock, a2->buf, a2->buflen, &a2->addr1);
           if ( result & 4 ) goto START_RECV;
       }
       if ( !(result & 4) ) goto EXIT;
START_RECV:
       for (int j = 2; j < 2000; j++ ) {
           msglen = 0;
           for(int i=0; i < 3; i++) {
               result = call_recvfrom(10, (int)&peeraddr, (int)&msglen, sock,
                        &recvmsgbuf, 8192);
               if (result & 2 ) msglen = 0;
               if (result & 1 ) {
                   msglen = 0;
                   if ( !(result & 0x40) ) goto EXIT;
               }
               if (result & 4 ) {
                   if (peeraddr.sin_addr == a2->addr2.sin_addr && peeraddr.sin_port ==
                       a2->addr2.sin_port) break;
                   msglen = 0;
               }
           }
           if ( !msglen ) goto EXIT;
           /* get the locaddr */
           getsockname_then_getpeername(&locaddr, 0, sock);
           client_handle_recvmsg(&peeraddr, &recvmsgbuf, msglen, &locaddr, local_peer,
                                 17,
sock, &sentmsgbuf, &result, 0);
           if ( !result ) goto EXIT;
           for (int i = 0; i < 3; ++i ) {
                result = call_select_and_sendto(10, sock, &sentmsgbuf, result,
                         &a2->addr1);
                if ( result & 4 ) goto NEXT_MESSAGE;
           }
           if ( !(result & 4) ) goto EXIT;
NEXT_MESSAGE:
       }
   }
EXIT:
}

SOURCE LISTING 14: UDP client function



 


 







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.