From ca72bf7f9ff827dabbea06c22d759344565c4b3f Mon Sep 17 00:00:00 2001 From: skarg Date: Wed, 7 Dec 2005 17:01:26 +0000 Subject: [PATCH] modified the BACnet/IP init code for the win32 platform to make it work on my system. It seems that something else is intercepting the packets when the bind was set to INADDR_ANY, so I just bind to the host default adapter. --- bacnet-stack/ports/linux/bip-init.c | 2 +- bacnet-stack/ports/win32/bacnet.ide | Bin 52528 -> 52606 bytes bacnet-stack/ports/win32/bacnet/bacnet.dsp | 16 ++++++- bacnet-stack/ports/win32/bacnet/bacnet.ncb | Bin 189440 -> 230400 bytes bacnet-stack/ports/win32/bacnet/bacnet.opt | Bin 54784 -> 55808 bytes bacnet-stack/ports/win32/bip-init.c | 47 ++++++++++++++++----- bacnet-stack/ports/win32/main.c | 41 ++++++++++++++++-- 7 files changed, 88 insertions(+), 18 deletions(-) diff --git a/bacnet-stack/ports/linux/bip-init.c b/bacnet-stack/ports/linux/bip-init.c index 1237467f..ef79a231 100644 --- a/bacnet-stack/ports/linux/bip-init.c +++ b/bacnet-stack/ports/linux/bip-init.c @@ -123,7 +123,7 @@ bool bip_init(void) sin.sin_family = AF_INET; sin.sin_addr.s_addr = htonl(INADDR_ANY); sin.sin_port = htons(bip_get_port()); - memset(&(sin.sin_zero), '\0', 8); + memset(&(sin.sin_zero), '\0', sizeof(sin.sin_zero)); status = bind(sock_fd, (const struct sockaddr*)&sin, sizeof(struct sockaddr)); if (status < 0) diff --git a/bacnet-stack/ports/win32/bacnet.ide b/bacnet-stack/ports/win32/bacnet.ide index 08db2149d66fefff402252b577f9ba4d5996925a..b90772d3484e5844866541be36a45b093f0fafcb 100644 GIT binary patch delta 7844 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 QqH&X%mVpxgpO*^#KaWb{hX4Qo diff --git a/bacnet-stack/ports/win32/bacnet/bacnet.dsp b/bacnet-stack/ports/win32/bacnet/bacnet.dsp index 6bab091a..6ced4a8e 100644 --- a/bacnet-stack/ports/win32/bacnet/bacnet.dsp +++ b/bacnet-stack/ports/win32/bacnet/bacnet.dsp @@ -67,7 +67,7 @@ LINK32=link.exe # PROP Ignore_Export_Lib 0 # PROP Target_Dir "" # ADD BASE CPP /nologo /W3 /Gm /GX /ZI /Od /D "WIN32" /D "_DEBUG" /D "_CONSOLE" /D "_MBCS" /YX /FD /GZ /c -# ADD CPP /nologo /W3 /Gm /GX /ZI /Od /I "c:\code\bacnet-stack\\" /I "c:\code\bacnet-stack\ports\win32\\" /D "WIN32" /D "_DEBUG" /D "_CONSOLE" /D "_MBCS" /D "BACDL_BIP" /FD /GZ /c +# ADD CPP /nologo /W3 /Gm /GX /ZI /Od /I "c:\code\bacnet-stack\\" /I "c:\code\bacnet-stack\ports\win32\\" /D "WIN32" /D "_DEBUG" /D "_CONSOLE" /D "_MBCS" /D "BACDL_BIP" /FR /FD /GZ /c # SUBTRACT CPP /YX # ADD BASE RSC /l 0x409 /d "_DEBUG" # ADD RSC /l 0x409 /d "_DEBUG" @@ -125,11 +125,19 @@ SOURCE=..\..\..\bacfile.c # End Source File # Begin Source File +SOURCE=..\..\..\bactext.c +# End Source File +# Begin Source File + SOURCE=..\..\..\bigend.c # End Source File # Begin Source File -SOURCE=..\bip.c +SOURCE="..\bip-init.c" +# End Source File +# Begin Source File + +SOURCE=..\..\..\bip.c # End Source File # Begin Source File @@ -153,6 +161,10 @@ SOURCE=..\..\..\iam.c # End Source File # Begin Source File +SOURCE=..\..\..\indtext.c +# End Source File +# Begin Source File + SOURCE=..\main.c # End Source File # Begin Source File diff --git a/bacnet-stack/ports/win32/bacnet/bacnet.ncb b/bacnet-stack/ports/win32/bacnet/bacnet.ncb index 608816c15b33fe24db4b97d0e1e87b7f56626148..43f68495dc48a56fddac5f0bba157dc9d0689d50 100644 GIT binary patch delta 21837 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 diff --git a/bacnet-stack/ports/win32/bacnet/bacnet.opt b/bacnet-stack/ports/win32/bacnet/bacnet.opt index 962bdcfb362608c818a836515dab3ded20061c60..0a49b61eeaaad1b62b8f08ae5e685d881ee3e8b1 100644 GIT binary patch literal 55808 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 diff --git a/bacnet-stack/ports/win32/bip-init.c b/bacnet-stack/ports/win32/bip-init.c index a2ae9250..5aeb083f 100644 --- a/bacnet-stack/ports/win32/bip-init.c +++ b/bacnet-stack/ports/win32/bip-init.c @@ -80,6 +80,11 @@ static void set_broadcast_address(uint32_t net_address) #endif } +static void cleanup(void) +{ + WSACleanup(); +} + bool bip_init(void) { int rv = 0; // return from socket lib calls @@ -92,7 +97,6 @@ bool bip_init(void) struct in_addr address; Result = WSAStartup(MAKEWORD(2,2), &wd); - if (Result != 0) { Code = WSAGetLastError(); @@ -100,6 +104,8 @@ bool bip_init(void) Code); exit(1); } + atexit(cleanup); + address.s_addr = gethostaddr(); if (address.s_addr == (unsigned)-1) { @@ -116,7 +122,7 @@ bool bip_init(void) sock_fd = socket(AF_INET, SOCK_DGRAM, IPPROTO_UDP); bip_set_socket(sock_fd); if (sock_fd < 0) - return false; + return false; // Allow us to use the same socket for sending and receiving // This makes sure that the src port is correct when sending @@ -124,25 +130,44 @@ bool bip_init(void) (char *)&value, sizeof(value)); if (rv < 0) { - close(sock_fd); - bip_set_socket(-1); - return false; + close(sock_fd); + bip_set_socket(-1); + return false; } // allow us to send a broadcast rv = setsockopt(sock_fd, SOL_SOCKET, SO_BROADCAST, - (char *)&value, sizeof(value)); + (char *)&value, sizeof(value)); if (rv < 0) { - close(sock_fd); - bip_set_socket(-1); - return false; + close(sock_fd); + bip_set_socket(-1); + return false; } // bind the socket to the local port number and IP address sin.sin_family = AF_INET; - sin.sin_addr.s_addr = htonl(INADDR_ANY); + /* by setting sin.sin_addr.s_addr to INADDR_ANY, + I am telling the IP stack to automatically fill + in the IP address of the machine the process + is running on. + + Some server computers have multiple IP addresses. + A socket bound to one of these will not accept + connections to another address. Frequently you prefer + to allow any one of the computer's IP addresses + to be used for connections. Use INADDR_ANY (0L) to + allow clients to connect using any one of the host's + IP addresses. + + Note: sometimes INADDR_ANY does not let me get + any unicast messages. Not sure why... + */ + /* sin.sin_addr.s_addr = htonl(INADDR_ANY); */ + /* or we could use the specific adapter address + note: already in network byte order */ + sin.sin_addr.s_addr = address.s_addr; sin.sin_port = htons(bip_get_port()); - memset(&(sin.sin_zero), '\0', 8); + memset(&(sin.sin_zero), '\0', sizeof(sin.sin_zero)); rv = bind(sock_fd, (const struct sockaddr*)&sin, sizeof(struct sockaddr)); if (rv < 0) diff --git a/bacnet-stack/ports/win32/main.c b/bacnet-stack/ports/win32/main.c index 54978d02..5b817679 100644 --- a/bacnet-stack/ports/win32/main.c +++ b/bacnet-stack/ports/win32/main.c @@ -29,6 +29,7 @@ #include #include #include +#include /* for kbhit and getch */ #include "iam.h" #include "address.h" #include "config.h" @@ -171,7 +172,7 @@ static void print_address( BACNET_ADDRESS *dest) // destination address { int i = 0; // counter - + if (dest) { printf("%s: ",name); @@ -183,6 +184,30 @@ static void print_address( } } +static void print_address_cache(void) +{ + unsigned i,j; + BACNET_ADDRESS address; + uint32_t device_id = 0; + unsigned max_apdu = 0; + + fprintf(stderr,"Device\tMAC\tMaxAPDU\tNet\n"); + for (i = 0; i < MAX_ADDRESS_CACHE; i++) + { + if (address_get_by_index(i,&device_id, &max_apdu, &address)) + { + fprintf(stderr,"%u\t",device_id); + for (j = 0; j < address.mac_len; j++) + { + fprintf(stderr,"%02X",address.mac[j]); + } + fprintf(stderr,"\t"); + fprintf(stderr,"%hu\t",max_apdu); + fprintf(stderr,"%hu\n",address.net); + } + } +} + int main(int argc, char *argv[]) { BACNET_ADDRESS src = {0}; // address where message came from @@ -200,12 +225,12 @@ int main(int argc, char *argv[]) if (!bip_init()) return 1; - datalink_get_broadcast_address(&broadcast_address); + datalink_get_broadcast_address(&broadcast_address); print_address("Broadcast",&broadcast_address); datalink_get_my_address(&my_address); print_address("Address",&my_address); - - printf("BACnet stack running...\n"); + + printf("BACnet stack running...\n"); // loop forever for (;;) { @@ -243,5 +268,13 @@ int main(int argc, char *argv[]) // output // blink LEDs, Turn on or off outputs, etc + + /* wait for ESC from keyboard before quitting */ + if (kbhit() && (getch() == 0x1B)) + break; } + + print_address_cache(); + + return 0; }