473,657 Members | 2,531 Online
Bytes | Software Development & Data Engineering Community
+ Post

Home Posts Topics Members FAQ

Evaluation of C program

Hi,

I'm a python programmer that's started to play a bit with C as I'll
probably have to make C extensions eventually.. I made this little
program that I'd like to get feedback on, it's basically a find
substring and return pointer to it function and tests for it..

Could this be done better/differently? Is anything fundamentally
wrong?

---

#include <stdio.h>

char *find_substring (char *substring, char *string) {
int index_string, index_substring ;
for (index_string = 0; string[index_string] != 0; index_string++) {
index_substring = 0;
do {
if (substring[index_substring] == 0)
goto success;
if (string[index_string + index_substring] !=
substring[index_substring])
goto next;
} while (++index_substr ing);
success:
return &string[index_string];
next: ;
}
return 0;
}

int main() {
if(find_substri ng("test", "this is a test"))
printf("Found test in string!\n");

return 0;
}

---

Thanks,

Morten

Feb 16 '06 #1
8 1458
In article <11************ **********@g43g 2000cwa.googleg roups.com>,
<mo*****@gmail. com> wrote:
I'm a python programmer that's started to play a bit with C as I'll
probably have to make C extensions eventually.. I made this little
program that I'd like to get feedback on, it's basically a find
substring and return pointer to it function and tests for it.. Could this be done better/differently? Is anything fundamentally
wrong? #include <stdio.h>
Your entire find_substring( ) function could be replaced with a
single call to strstr();
char *find_substring (char *substring, char *string) {
int index_string, index_substring ;
for (index_string = 0; string[index_string] != 0; index_string++) {
strings can be longer than an 'int' can hold. Check out size_t
index_substring = 0;
do {
if (substring[index_substring] == 0)
goto success;
goto should rarely be used. Consider using "break" here.
if (string[index_string + index_substring] !=
substring[index_substring])
goto next;
goto should rarely be used. Consider using "continue" here.
} while (++index_substr ing);
The only way that ++index_substri ng could be false in that test is
if the int representation overflowed. This suggests that you are using
the wrong control structure; consider using a for().
success:
return &string[index_string];
next: ;
}
return 0;
Returning 0 is not wrong here, but it would be more readable
if you were to use NULL instead of 0.
}
int main() {
int main(void) {
if(find_substri ng("test", "this is a test"))
printf("Found test in string!\n");
If you do not find the substring, then you print nothing, and
won't know what happened.
return 0;
Returning 0 indicates success, but it could be argued that if you
do not find the substring then your program has failed and so
returning EXIT_FAILURE (from <stdlib.h>) would be more appropriate
in that instance.
}
Could this be done better/differently?


Suppose you don't find a match the first iteration through
because the 10th character in the trial substring does not match
the 10th character in the input string. You then loop back
and start testing from the substring again from the second
character of the input string -- ignoring all the information
you could have gleened by paying attention to what was in
offsets 1 thru 9 that you have already looked at.

Suppose for example that what you found at the 10th character at the
input string was an 'X', and there are no occurances of 'X' in the
trial substring. A moment's reflection would show you that in
such an instance you would be able to skip testing for the
substring as starting from 1 thru 9, since that 'X' will still be
there at offset 9 blocking any possible match.

What this tells you is that there are algorithms which can be
much faster than your search algorithm. Indeed, there is an entire
literature on search algorithms. Some are probably mentioned in the C
FAQ or by googling for "string search algorithms".
--
If you lie to the compiler, it will get its revenge. -- Henry Spencer
Feb 16 '06 #2
>> #include <stdio.h>

Your entire find_substring( ) function could be replaced with a
single call to strstr();


Yep. This was an exercise so I didn't look, but good to know.
char *find_substring (char *substring, char *string) {
int index_string, index_substring ;
for (index_string = 0; string[index_string] != 0; index_string++) {


strings can be longer than an 'int' can hold. Check out size_t


Good point.
index_substring = 0;
do {
if (substring[index_substring] == 0)
goto success;


goto should rarely be used. Consider using "break" here.
if (string[index_string + index_substring] !=
substring[index_substring])
goto next;


goto should rarely be used. Consider using "continue" here.


I don't see the harm in using goto.. it does the job. :-)
} while (++index_substr ing);


The only way that ++index_substri ng could be false in that test is
if the int representation overflowed. This suggests that you are using
the wrong control structure; consider using a for().


Well, it will always goto using one of the two statements above it, so
it works. But it should be a long, yes.
success:
return &string[index_string];
next: ;
}
return 0;


Returning 0 is not wrong here, but it would be more readable
if you were to use NULL instead of 0.


Yep.
}

int main() {


int main(void) {
if(find_substri ng("test", "this is a test"))
printf("Found test in string!\n");


If you do not find the substring, then you print nothing, and
won't know what happened.


Yeah..
return 0;


Returning 0 indicates success, but it could be argued that if you
do not find the substring then your program has failed and so
returning EXIT_FAILURE (from <stdlib.h>) would be more appropriate
in that instance.
}


Could this be done better/differently?


Suppose you don't find a match the first iteration through
because the 10th character in the trial substring does not match
the 10th character in the input string. You then loop back
and start testing from the substring again from the second
character of the input string -- ignoring all the information
you could have gleened by paying attention to what was in
offsets 1 thru 9 that you have already looked at.

Suppose for example that what you found at the 10th character at the
input string was an 'X', and there are no occurances of 'X' in the
trial substring. A moment's reflection would show you that in
such an instance you would be able to skip testing for the
substring as starting from 1 thru 9, since that 'X' will still be
there at offset 9 blocking any possible match.

What this tells you is that there are algorithms which can be
much faster than your search algorithm. Indeed, there is an entire
literature on search algorithms. Some are probably mentioned in the C
FAQ or by googling for "string search algorithms".


OK. This was a bit beyond what I was looking to figure out, but good to
know I guess.

Thanks. :)

-Morten
Feb 16 '06 #3

"Walter Roberson" <ro******@ibd.n rc-cnrc.gc.ca> wrote in message
news:dt******** **@canopus.cc.u manitoba.ca...
In article <11************ **********@g43g 2000cwa.googleg roups.com>,
<mo*****@gmail. com> wrote:
I'm a python programmer that's started to play a bit with C as I'll
probably have to make C extensions eventually.. I made this little
program that I'd like to get feedback on, it's basically a find
substring and return pointer to it function and tests for it..
Could this be done better/differently? Is anything fundamentally
wrong?

#include <stdio.h>


Your entire find_substring( ) function could be replaced with a
single call to strstr();
char *find_substring (char *substring, char *string) {
int index_string, index_substring ;
for (index_string = 0; string[index_string] != 0; index_string++) {


strings can be longer than an 'int' can hold. Check out size_t
index_substring = 0;
do {
if (substring[index_substring] == 0)
goto success;


goto should rarely be used. Consider using "break" here.
if (string[index_string + index_substring] !=
substring[index_substring])
goto next;


goto should rarely be used. Consider using "continue" here.
} while (++index_substr ing);


The only way that ++index_substri ng could be false in that test is
if the int representation overflowed. This suggests that you are using
the wrong control structure; consider using a for().
success:
return &string[index_string];
next: ;
}
return 0;


Returning 0 is not wrong here, but it would be more readable
if you were to use NULL instead of 0.
}


int main() {


int main(void) {
if(find_substri ng("test", "this is a test"))
printf("Found test in string!\n");


If you do not find the substring, then you print nothing, and
won't know what happened.

return 0;


Returning 0 indicates success, but it could be argued that if you
do not find the substring then your program has failed and so
returning EXIT_FAILURE (from <stdlib.h>) would be more appropriate
in that instance.
}


Could this be done better/differently?


Suppose you don't find a match the first iteration through
because the 10th character in the trial substring does not match
the 10th character in the input string. You then loop back
and start testing from the substring again from the second
character of the input string -- ignoring all the information
you could have gleened by paying attention to what was in
offsets 1 thru 9 that you have already looked at.

Suppose for example that what you found at the 10th character at the
input string was an 'X', and there are no occurances of 'X' in the
trial substring. A moment's reflection would show you that in
such an instance you would be able to skip testing for the
substring as starting from 1 thru 9, since that 'X' will still be
there at offset 9 blocking any possible match.

Not True!

Suppose string = "XXXXXXXXXX Y"
and substring = "XXXXXXXXXY "

They do not match beginning from index 0, since 'X' != 'Y'
But you cannot skip to index 9, since they DO match statring at index 1.
What this tells you is that there are algorithms which can be
much faster than your search algorithm. Indeed, there is an entire
literature on search algorithms. Some are probably mentioned in the C
FAQ or by googling for "string search algorithms".
--
If you lie to the compiler, it will get its revenge. -- Henry Spencer


--
Fred L. Kleinschmidt
Boeing Associate Technical Fellow
Technical Architect, Software Reuse Project
Feb 16 '06 #4
In article <Iu********@new s.boeing.com>,
Fred Kleinschmidt <fr************ ******@boeing.c om> wrote:
"Walter Roberson" <ro******@ibd.n rc-cnrc.gc.ca> wrote in message
news:dt******* ***@canopus.cc. umanitoba.ca...
Suppose for example that what you found at the 10th character at the
input string was an 'X', and there are no occurances of 'X' in the
trial substring. A moment's reflection would show you that in
such an instance you would be able to skip testing for the
substring as starting from 1 thru 9, since that 'X' will still be
there at offset 9 blocking any possible match.

Not True! Suppose string = "XXXXXXXXXX Y"
and substring = "XXXXXXXXXY " They do not match beginning from index 0, since 'X' != 'Y'
But you cannot skip to index 9, since they DO match statring at index 1.


But that violates the proposition "and there are no occurances
of 'X' in the trial substring".
--
I was very young in those days, but I was also rather dim.
-- Christopher Priest
Feb 17 '06 #5
mo*****@gmail.c om wrote:
I'm a python programmer that's started to play a bit with C as I'll
probably have to make C extensions eventually.. I made this little
program that I'd like to get feedback on, it's basically a find
substring and return pointer to it function and tests for it..

Could this be done better/differently? Is anything fundamentally
wrong?

---

#include <stdio.h>

char *find_substring (char *substring, char *string) {
int index_string, index_substring ;
for (index_string = 0; string[index_string] != 0; index_string++) {
index_substring = 0;
do {
if (substring[index_substring] == 0)
goto success;
if (string[index_string + index_substring] !=
substring[index_substring])
goto next;
} while (++index_substr ing);
success:
return &string[index_string];
next: ;
}
return 0;
}

int main() {
if(find_substri ng("test", "this is a test"))
printf("Found test in string!\n");

return 0;
}


Here is how I would do it.
--- Source Text ---

#include <stdio.h>
#include <string.h>
/* Returns the starting index of pattern in s or -1 if not found. */

int position(const char *pattern, const char *s)
{
int j, k, plen, slen, res;

plen = strlen(pattern) ;
slen = strlen(s);
res = -1;
j = 0;
while ((res < 0) && (j + plen < slen)) {
k = 0;
while ((k < plen) && (pattern[k] == s[j + k])) { k++; }
if (k == plen) { res = j; }
j++;
}
return res;
}
int main(void)
{
char s[] = "Hello there!";
char pattern[] = "there";
int pos;

pos = position(patter n, s);
if (pos < 0) {
printf("\"%s\" does not contain \"%s\".\n", s, pattern);
} else {
printf("\"%s\" contains \"%s\" starting at index %d.\n",
s, pattern, pos);
}
return 0;
}

--- End Of Source Text ---
August

--
I am the "ILOVEGNU" signature virus. Just copy me to your
signature. This email was infected under the terms of the GNU
General Public License.
Feb 17 '06 #6
> Here is how I would do it.


--- Source Text ---

#include <stdio.h>
#include <string.h>
/* Returns the starting index of pattern in s or -1 if not found. */

int position(const char *pattern, const char *s)
{
int j, k, plen, slen, res;

plen = strlen(pattern) ;
slen = strlen(s);
res = -1;
j = 0;
while ((res < 0) && (j + plen < slen)) {
k = 0;
while ((k < plen) && (pattern[k] == s[j + k])) { k++; }
if (k == plen) { res = j; }
j++;
}
return res;
}


This was a nice example. Thanks for posting it. :-)

-Morten
Feb 17 '06 #7
Walter Roberson wrote:
In article <11************ **********@g43g 2000cwa.googleg roups.com>,
<mo*****@gmail. com> wrote:
I'm a python programmer that's started to play a bit with C as I'll
probably have to make C extensions eventually.. I made this little
program that I'd like to get feedback on, it's basically a find
substring and return pointer to it function and tests for it..
Could this be done better/differently? Is anything fundamentally
wrong?

Suppose you don't find a match the first iteration through
because the 10th character in the trial substring does not match
the 10th character in the input string. You then loop back
and start testing from the substring again from the second
character of the input string -- ignoring all the information
you could have gleened by paying attention to what was in
offsets 1 thru 9 that you have already looked at.

Suppose for example that what you found at the 10th character at the
input string was an 'X', and there are no occurances of 'X' in the
trial substring. A moment's reflection would show you that in
such an instance you would be able to skip testing for the
substring as starting from 1 thru 9, since that 'X' will still be
there at offset 9 blocking any possible match.

What this tells you is that there are algorithms which can be
much faster than your search algorithm. Indeed, there is an entire
literature on search algorithms. Some are probably mentioned in the C
FAQ or by googling for "string search algorithms".


Boyer Horspool Moore comes to mind. I implemented it with
a circular buffer; it's fast.

Stijn

Feb 17 '06 #8
mi****@gmail.co m wrote:
Walter Roberson wrote:
<mo*****@gmail. com> wrote:
I'm a python programmer that's started to play a bit with C as
I'll probably have to make C extensions eventually.. I made
this little program that I'd like to get feedback on, it's
basically a find substring and return pointer to it function
and tests for it..

Could this be done better/differently? Is anything fundamentally
wrong?

Suppose you don't find a match the first iteration through
because the 10th character in the trial substring does not match
the 10th character in the input string. You then loop back
and start testing from the substring again from the second
character of the input string -- ignoring all the information
you could have gleened by paying attention to what was in
offsets 1 thru 9 that you have already looked at.

Suppose for example that what you found at the 10th character at the
input string was an 'X', and there are no occurances of 'X' in the
trial substring. A moment's reflection would show you that in
such an instance you would be able to skip testing for the
substring as starting from 1 thru 9, since that 'X' will still be
there at offset 9 blocking any possible match.

What this tells you is that there are algorithms which can be
much faster than your search algorithm. Indeed, there is an entire
literature on search algorithms. Some are probably mentioned in the C
FAQ or by googling for "string search algorithms".


Boyer Horspool Moore comes to mind. I implemented it with
a circular buffer; it's fast.


Knuth-Morris-Pratt has the distinct advantage of allowing operation
on streams and totally avoiding any need for look ahead or look
back. The following is from a post I made here almost two years
ago, and illustrates the use of KMP on a file stream.

/*
Leor Zolman wrote: On 25 Feb 2004 07:34:40 -0800, jo**@ljungh.se (spike) wrote:
Im trying to write a program that should read through a binary
file searching for the character sequence "\name\"

Then it should read the characters following the "\name\"
sequence until a NULL character is encountered.

But when my program runs it gets a SIGSEGV (Segmentation
vioalation) signal.

Whats wrong? And is there a better way than mine to solve
this task (most likely)


I think so. Here's a version I just threw together:

*/

/* And heres another throw -- binfsrch.c by CBF */
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <ctype.h>
#include <assert.h>

/* The difference between a binary and a text file, on read,
is the conversion of end-of-line delimiters. What those
delimiters are does not affect the action. In some cases
the presence of 0x1a EOF markers (MsDos) does.

This is a version of Knuth-Morris-Pratt algorithm. The
point of using this is to avoid any backtracking in file
reading, and thus avoiding any use of buffer arrays.
*/

size_t chrcount; /* debuggery, count of input chars, zeroed */

/* --------------------- */

/* Almost straight out of Sedgewick */
/* The next array indicates what index in id should next be
compared to the current char. Once the (lgh - 1)th char
has been successfully compared, the id has been found.
The array is formed by comparing id to itself. */
void initnext(int *next, const char *id, int lgh)
{
int i, j;

assert(lgh > 0);
next[0] = -1; i = 0; j = -1;
while (i < lgh) {
while ((j >= 0) && (id[i] != id[j])) j = next[j];
i++; j++;
next[i] = j;
}
#if (0)
for (i = 0; i < lgh; i++)
printf("id[%d] = '%c' next[%d] = %d\n",
i, id[i], i, next[i]);
#endif
} /* initnext */

/* --------------------- */

/* reads f without rewinding until either EOF or *marker
has been found. Returns EOF if not found. At exit the
last matching char has been read, and no further. */
int kmpffind(const char *marker, int lgh, int *next, FILE *f)
{
int j; /* char position in marker to check */
int ch; /* current char */

assert(lgh > 0);
j = 0;
while ((j < lgh) && (EOF != (ch = getc(f)))) {
chrcount++;
while ((j >= 0) && (ch != marker[j])) j = next[j];
j++;
}
return ch;
} /* kmpffind */

/* --------------------- */

/* Find marker in f, display following printing chars
up to some non printing character or EOF */
int binfsrch(const char *marker, FILE *f)
{
int *next;
int lgh;
int ch;
int items; /* count of markers found */

lgh = strlen(marker);
if (!(next = malloc(lgh * sizeof *next))) {
puts("No memory");
exit(EXIT_FAILU RE);
}
else {
initnext(next, marker, lgh);
items = 0;
while (EOF != kmpffind(marker , lgh, next, f)) {
/* found, take appropriate action */
items++;
printf("%d %s : \"", items, marker);
while (isprint(ch = getc(f))) {
chrcount++;
putchar(ch);
}
puts("\"");
if (EOF == ch) break;
else chrcount++;
}
free(next);
return items;
}
} /* binfsrch */

/* --------------------- */

int main(int argc, char **argv)
{
FILE *f;

f = stdin;
if (3 == argc) {
if (!(f = fopen(argv[2], "rb"))) {
printf("Can't open %s\n", argv[2]);
exit(EXIT_FAILU RE);
}
argc--;
}
if (2 != argc) {
puts("Usage: binfsrch name [binaryfile]");
puts(" (file defaults to stdin text mode)");
}
else if (binfsrch(argv[1], f)) {
printf("\"%s\" : found\n", argv[1]);
}
else printf("\"%s\" : not found\n", argv[1]);
printf("%lu chars\n", (unsigned long)chrcount);
return 0;
} /* main binfsrch */

--
"If you want to post a followup via groups.google.c om, don't use
the broken "Reply" link at the bottom of the article. Click on
"show options" at the top of the article, then click on the
"Reply" at the bottom of the article headers." - Keith Thompson
More details at: <http://cfaj.freeshell. org/google/>
Also see <http://www.safalra.com/special/googlegroupsrep ly/>
Feb 17 '06 #9

This thread has been closed and replies have been disabled. Please start a new discussion.

Similar topics

7
2848
by: Leo Breebaart | last post by:
Hi all, I have a question about Python and delayed evaluation. Short-circuiting of Boolean expressions implies that in: >>> if a() and b(): any possible side-effects the call to b() might have will not happen of a() returns true, because then b() will never be
20
2330
by: Ilias Lazaridis | last post by:
" A cooperation between Sun Microsystems and IBM&Co. in conjunction with liberal & high evolutive communities would result in an nearly unbeatable programming platform. My evaluation has shown: this is a non achievable goal, as stubborness and egoism rules - instead of reason and cooperation. Thus I leave all those ridiculous folks behind, which will continue to do an excellent job in keeping the very promising JAVA platform far
16
697
by: Bhushit Joshipura | last post by:
This post contains one question and one proposal. A. May I know why order of evaluation of arguments is not specified in C/C++? I asked a question in comp.lang.c++ for the following possibility and because the languages do not specify the order of evaluation, doing so was an error. int B::f ( int i, int j = i + 1 ) { // j defaults to i + 1
15
2933
by: Jens.Toerring | last post by:
Hi, I have a possibly rather stupid question about the order of evaluation in a statement like this: result = foo( x ) - bar( y ); How can I make 100% sure that foo(x) is evaluated before bar(y), where foo() and bar() can be either functions or macros? I got into problems with this when writing some hardware-related stuff where foo() and bar()
77
4697
by: berns | last post by:
Hi All, A coworker and I have been debating the 'correct' expectation of evaluation for the phrase a = b = c. Two different versions of GCC ended up compiling this as b = c; a = b and the other ended up compiling it as a = c; b = c. (Both with no optimizations enabled). How did we notice you may ask? Well, in our case 'b' was a memory mapped register that only has a select number of writable bits. He claims it has been a 'C...
10
353
by: int main(void) | last post by:
Hi all, In the following program, #include<stdio.h> int main(void) { int x = 10; int y = 10;
32
3299
by: silpau | last post by:
hi, i am a bit confused on expression evaluation order in expressions involving unary increment.decrement operators along with binary operators. For example in the following expression x += i + j + k++;
54
3915
by: Rasjid | last post by:
Hello, I have just joined and this is my first post. I have never been able to resolve the issue of order of evaluation in C/C++ and the related issue of precedence of operators, use of parentheses. 1) "The order of evaluation of subexpressions is determined by the precedence and grouping of operators."
11
1663
by: Pietro Cerutti | last post by:
Hi group, here I come with a question which is quite simple per se, but for which I can't find an answer. Does the C standard guarantee that inside an expression such as (x && y) "y" is not evaluated if "x" evaluates to 0?
39
5053
by: Boltar | last post by:
Why does C do lazy evaluation for logical boolean operations but not bitwise ones? Ie: the following program prints "1 2" , not "1 1" under gcc main() { int a = 1; int b = 1; 0 && ++a;
0
8420
marktang
by: marktang | last post by:
ONU (Optical Network Unit) is one of the key components for providing high-speed Internet services. Its primary function is to act as an endpoint device located at the user's premises. However, people are often confused as to whether an ONU can Work As a Router. In this blog post, we’ll explore What is ONU, What Is Router, ONU & Router’s main usage, and What is the difference between ONU and Router. Let’s take a closer look ! Part I. Meaning of...
0
8842
Oralloy
by: Oralloy | last post by:
Hello folks, I am unable to find appropriate documentation on the type promotion of bit-fields when using the generalised comparison operator "<=>". The problem is that using the GNU compilers, it seems that the internal comparison operator "<=>" tries to promote arguments from unsigned to signed. This is as boiled down as I can make it. Here is my compilation command: g++-12 -std=c++20 -Wnarrowing bit_field.cpp Here is the code in...
0
8740
jinu1996
by: jinu1996 | last post by:
In today's digital age, having a compelling online presence is paramount for businesses aiming to thrive in a competitive landscape. At the heart of this digital strategy lies an intricately woven tapestry of website design and digital marketing. It's not merely about having a website; it's about crafting an immersive digital experience that captivates audiences and drives business growth. The Art of Business Website Design Your website is...
1
8516
by: Hystou | last post by:
Overview: Windows 11 and 10 have less user interface control over operating system update behaviour than previous versions of Windows. In Windows 11 and 10, there is no way to turn off the Windows Update option using the Control Panel or Settings app; it automatically checks for updates and installs any it finds, whether you like it or not. For most users, this new feature is actually very convenient. If you want to control the update process,...
0
8617
tracyyun
by: tracyyun | last post by:
Dear forum friends, With the development of smart home technology, a variety of wireless communication protocols have appeared on the market, such as Zigbee, Z-Wave, Wi-Fi, Bluetooth, etc. Each protocol has its own unique characteristics and advantages, but as a user who is planning to build a smart home system, I am a bit confused by the choice of these technologies. I'm particularly interested in Zigbee because I've heard it does some...
0
7353
agi2029
by: agi2029 | last post by:
Let's talk about the concept of autonomous AI software engineers and no-code agents. These AIs are designed to manage the entire lifecycle of a software development project—planning, coding, testing, and deployment—without human intervention. Imagine an AI that can take a project description, break it down, write the code, debug it, and then launch it, all on its own.... Now, this would greatly impact the work of software developers. The idea...
1
6176
isladogs
by: isladogs | last post by:
The next Access Europe User Group meeting will be on Wednesday 1 May 2024 starting at 18:00 UK time (6PM UTC+1) and finishing by 19:30 (7.30PM). In this session, we are pleased to welcome a new presenter, Adolph Dupré who will be discussing some powerful techniques for using class modules. He will explain when you may want to use classes instead of User Defined Types (UDT). For example, to manage the data in unbound forms. Adolph will...
0
4173
by: TSSRALBI | last post by:
Hello I'm a network technician in training and I need your help. I am currently learning how to create and manage the different types of VPNs and I have a question about LAN-to-LAN VPNs. The last exercise I practiced was to create a LAN-to-LAN VPN between two Pfsense firewalls, by using IPSEC protocols. I succeeded, with both firewalls in the same network. But I'm wondering if it's possible to do the same thing, with 2 Pfsense firewalls...
2
1733
bsmnconsultancy
by: bsmnconsultancy | last post by:
In today's digital era, a well-designed website is crucial for businesses looking to succeed. Whether you're a small business owner or a large corporation in Toronto, having a strong online presence can significantly impact your brand's success. BSMN Consultancy, a leader in Website Development in Toronto offers valuable insights into creating effective websites that not only look great but also perform exceptionally well. In this comprehensive...

By using Bytes.com and it's services, you agree to our Privacy Policy and Terms of Use.

To disable or enable advertisements and analytics tracking please visit the manage ads & tracking page.