#include <sys/types.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <arpa/inet.h>
#include <unistd.h>
#include <string.h>
#include <stdio.h>
#include <errno.h>
#include "/usr/local/freeway/include/dliicp.h"
#include "/usr/local/freeway/include/dliprot.h"
/* LOCAL_UDP_PORT and FOREIGN_UDP_PORT must be defined at compile time */
#define FOREIGN_ADDR "192.168.1.255"
/* These structures show the format of the messages sent/received from ipapi */
typedef struct _DLI_ICP_HDR {
unsigned short usClientID; /* client's id (su_id) */
unsigned short usServerID; /* server's id (sp_id) */
unsigned short usDataBytes; /* databytes following (count) */
unsigned short usCommand; /* command */
short iStatus; /* status */
unsigned short usParms[3]; /* 3 extra parameters */
} DLI_ICP_HDR;
typedef struct _DLI_PROT_HDR
{
unsigned short usCommand; /* icp command */
short iModifier; /* icp modifier/subcommand */
unsigned short usLinkID; /* link ID */
unsigned short usCircuitID; /* circuit ID */
unsigned short usSessionID; /* session ID */
unsigned short usSequence; /* sequence */
unsigned short usReserved[2]; /* reserved ***2*** */
} DLI_PROT_HDR;
typedef struct {
DLI_ICP_HDR dli_icp_hdr;
DLI_PROT_HDR dli_prot_hdr;
unsigned char data [1024];
} MSG_BUFFER;
MSG_BUFFER test_message =
{
{ 0, 0, 0, 0, 0, { 0, 0, 0 } }, { 0, 0, 0, 0, 0, 0, { 0, 0 } },
"abcdefghijklmnopqrst abcdefghijklmnopqrst abcdefghijklmnopqrst"
};
MSG_BUFFER rcv_message;
#define ATTEMPT( x ) if ( (x) < 0 ) \
{ \
perror( "\nERROR: apisim_aws.c " ); \
printf( "Died at line %d, errno= %d.\n", \
__LINE__, errno ); \
exit( 1 ); \
}
int main()
{
int iTotSize;
short int usDataBytes;
int iTrueFlag;
struct sockaddr_in l_addr, l_addr2;
struct sockaddr_in f_addr, f_addr2;
int sock = socket( AF_INET, SOCK_DGRAM, 0);
int sock2 = socket( AF_INET, SOCK_DGRAM, 0);
bzero( (char *)&l_addr, sizeof( struct sockaddr_in ) );
bzero( (char *)&l_addr2, sizeof( struct sockaddr_in ) );
bzero( (char *)&f_addr, sizeof( struct sockaddr_in ) );
bzero( (char *)&f_addr2, sizeof( struct sockaddr_in ) );
l_addr.sin_family = l_addr2.sin_family = AF_INET;
f_addr.sin_family = f_addr2.sin_family = AF_INET;
l_addr.sin_port = htons( LOCAL_UDP_PORT );
l_addr2.sin_port = htons( LOCAL_UDP_PORT + 1 );
f_addr.sin_port = htons( FOREIGN_UDP_PORT );
f_addr2.sin_port = htons( FOREIGN_UDP_PORT + 1 );
f_addr.sin_addr.s_addr = f_addr2.sin_addr.s_addr = inet_addr(FOREIGN_ADDR);
ATTEMPT( bind( sock, (struct sockaddr *)&l_addr, sizeof( l_addr ) ) )
ATTEMPT( bind( sock2, (struct sockaddr *)&l_addr2, sizeof( l_addr2 ) ) )
iTrueFlag = 1;
ATTEMPT( setsockopt( sock, SOL_SOCKET, SO_BROADCAST,
(char *)&iTrueFlag, sizeof(iTrueFlag)) )
iTrueFlag = 1;
ATTEMPT( setsockopt( sock2, SOL_SOCKET, SO_BROADCAST,
(char *)&iTrueFlag, sizeof(iTrueFlag)) )
test_message.dli_icp_hdr.usCommand = htons( DLI_ICP_CMD_WRITE );
usDataBytes = strlen( test_message.data );
test_message.dli_icp_hdr.usDataBytes =
htons( usDataBytes + sizeof(DLI_PROT_HDR) );
iTotSize = usDataBytes + sizeof( DLI_ICP_HDR ) + sizeof(DLI_PROT_HDR);
test_message.dli_prot_hdr.usCommand = htons( DLI_PROT_SEND_NORM_DATA );
test_message.dli_prot_hdr.iModifier = htons( 0 );
test_message.dli_prot_hdr.usLinkID = htons( 0 );
test_message.dli_prot_hdr.usCircuitID = htons( 0 );
test_message.dli_prot_hdr.usSessionID = htons( 2 );
test_message.dli_prot_hdr.usReserved[0] = htons( 1 );
test_message.dli_prot_hdr.usReserved[1] = htons( usDataBytes );
bzero( &rcv_message, sizeof( rcv_message ) );
printf( "apisim: send %d bytes, %d byte string: %c%c%c%c, to port 0x%x.\n",
iTotSize, usDataBytes,
test_message.data[0], test_message.data[1],
test_message.data[2], test_message.data[3],
FOREIGN_UDP_PORT );
ATTEMPT( sendto( sock, &test_message, iTotSize, 0,
(struct sockaddr *)&f_addr, sizeof(f_addr) ) );
ATTEMPT( iTotSize = read( sock2, &rcv_message, sizeof( rcv_message ) ) );
printf( "apisim: received %d bytes; %d byte string: %c%c%c%c.\n",
iTotSize,
iTotSize - sizeof( DLI_ICP_HDR ) - sizeof( DLI_PROT_HDR ),
rcv_message.data[0], rcv_message.data[1],
rcv_message.data[2], rcv_message.data[3] );
close( sock );
close( sock2 );
exit( 0 );
}