sockaddr addr1; // 16 bytes
sockaddr addr2; // 16 bytes
char* buf;
int buflen;
} connect_struct;sockaddr addr2; // 16 bytes
char* buf;
int buflen;
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