473,688 Members | 3,258 Online
Bytes | Software Development & Data Engineering Community
+ Post

Home Posts Topics Members FAQ

C++ - STL usage 'Advice'


I'm perusing a slide with roughly 12 bullets spread across 3 pages.
Each bullet reflects 'advice'. I'm ok with all but 1 bullet, more
specifically the bullet that states:
" Avoid the STL unless absolutely necessary "

Now, I'm not acclimated with much C++ history, but something tells me
this is akin to trepidation that surrounded C++ during it's inception?
IOW, is this 'old school' rhetoric or ..... How do you refute this
argument?

I persued the web and there was discussion about code bloat (pre 2000
posts) but I'm not quite fure if I'm following that. Oh well, I
thought I'd inquire within. I'm a fan of lang.c++/learn and moderated
c++ and rest assured the vast majority of folks on here know what the
hell they're talking about so somebody will set me straight.

Granted, my background is signal proceesing, I've enjoyed the language
to include the STL and all it's glory (the Big O notation still
confuses me) but I'm tempted to go to the upcoming Vegas conference on
the language and ask Bjarne, Scott, Herb etc. this question :)
// formerly ma******@pegasu s.cc.ucf.edu

Oct 11 '05 #1
11 4742
On 11 Oct 2005 05:12:37 -0700, ma******@gmail. com wrote:
I'm perusing a slide with roughly 12 bullets spread across 3 pages.
Each bullet reflects 'advice'. I'm ok with all but 1 bullet, more
specifically the bullet that states:
" Avoid the STL unless absolutely necessary "
That prescription sounds biased against the use of STL. Perhaps a more
appropriate warning should be: "Be aware of the cost and consequences of using
STL before using it".
Now, I'm not acclimated with much C++ history, but something tells me
this is akin to trepidation that surrounded C++ during it's inception?
IOW, is this 'old school' rhetoric or ..... How do you refute this
argument?


You're right about the "old school" bias in many ways. However, there are
valid reasons not to use STL, especially if you live in the embedded world
where dynamic memory usage is frowned upon, due to the significant risk of
heap fragmentation. I can't use STL containers in my embedded project because
of that very reason.

However, STL (if used properly) gives you a wonderful toolkit, so that you
don't have to reinvent the wheel each time. It's also very efficient--many
implementations are as efficient as hand-written code once it gets through the
optimizer--so there are many compelling reasons to use it. Plus, it's part of
the language specification, so you know it's going to be portable.

There are other practical reasons not to use STL, e.g. when your program
already uses a similar class library (like MFC's CString and xxxArray classes)
extensively.

Using any library or feature is a cost-benefit tradeoff. Take a look at your
project and evaluate each toolkit against your needs. Don't dismiss anything
out of hand.

-dr
Oct 11 '05 #2
Dave Rahardja wrote:
On 11 Oct 2005 05:12:37 -0700, ma******@gmail. com wrote:
Now, I'm not acclimated with much C++ history, but something tells me
this is akin to trepidation that surrounded C++ during it's inception?
IOW, is this 'old school' rhetoric or ..... How do you refute this
argument?


You're right about the "old school" bias in many ways. However, there are
valid reasons not to use STL, especially if you live in the embedded world
where dynamic memory usage is frowned upon, due to the significant risk of
heap fragmentation. I can't use STL containers in my embedded project because
of that very reason.


That's not a case for avoiding the Standard Library - it's a case for
avoiding dynamically sized data structures altogether. But what's
stopping you from calling reserve() during the initialization phase?
This may vary by implementation, but I think that effectively gives
your container a pool of memory to play with - saving you from
fragmenting the rest of the heap.

The whole point of C++ and the Standard Library is to be able to use
them in a variety of ways, including for embedded systems. It's just a
matter of figuring out the right way to use them in your situation.
Maybe you have to reserve memory in advance. Maybe you have to write
your own allocator (I've seen that done before). Don't give up on the
Standard Library just because someone told you to.

Kristo

Oct 11 '05 #3
Dave Rahardja wrote:
On 11 Oct 2005 05:12:37 -0700, ma******@gmail. com wrote:

I'm perusing a slide with roughly 12 bullets spread across 3 pages.
Each bullet reflects 'advice'. I'm ok with all but 1 bullet, more
specificall y the bullet that states:
" Avoid the STL unless absolutely necessary "

That prescription sounds biased against the use of STL. Perhaps a more
appropriate warning should be: "Be aware of the cost and consequences of using
STL before using it".
[...]


Still sounds like STL (I presume the Standard library is meant) is somehow
a bad thing. I'd probably put it this way: "Weigh pros and cons of using
the Standard library mechanisms". Of course, being afraid of it should be
listed among "cons".

V
Oct 11 '05 #4
ma******@gmail. com wrote:
I'm perusing a slide with roughly 12 bullets spread across 3 pages.
Each bullet reflects 'advice'. I'm ok with all but 1 bullet, more
specifically the bullet that states:
" Avoid the STL unless absolutely necessary "

[snip]

It is a strangely worded directive. I'd say it's rarely
"absolutely necessary" to use the standard template
containers. It is often highly desirable, easier, faster
to design and code, easier to maintain, easier to document,
easier to test, etc. But I'd doubt that it is "absolutely
necessary" to use the STL. You can nearly always do the
same job "by hand" (by self-created code for example.)
It may be much more work to do it that way.

There may be important context missing here. Later (in the
part I snipped) you mention signal processing. It is just
possible that the intent of this directive is to achieve
something else that is not directly and trivially obvious
from the raw text. For example: If you were doing a system
that was going to be embedded in some device, it might make
sense. You might want to do things that made the smallest
possible stack size, just as an example. Or that used the
least possible amount of read/write memory. In many such
embedded systems there is only a very small amount of RAM,
and often that has to be shared among a lot of activity.
It may be difficult to have this level of minute detail
control if you pass off a lot of overhead to the standard
lib things.

So, by all means take into account the advice others have given.
But check with the powers-that-be in your project and try to
get them to tell you why this advice is there. It may be that
somebody got burnt by an old version of the standard lib that
did things poorly. Or there may in fact be a good reason for it.
Socks

Oct 11 '05 #5
ma******@gmail. com wrote:

How do you refute this
argument?


It's not an argument. It's a command. The way to refute it is to ignore
it. If whoever wrote that slide tells you why they wrote that particular
piece of [bad] advice then you can respond to their argument. Without
reasons, though, it's just noise.

--

Pete Becker
Dinkumware, Ltd. (http://www.dinkumware.com)
Oct 11 '05 #6
ma******@gmail. com wrote:
I'm perusing a slide with roughly 12 bullets spread across 3 pages.
Each bullet reflects 'advice'. I'm ok with all but 1 bullet, more
specifically the bullet that states:
" Avoid the STL unless absolutely necessary "

Now, I'm not acclimated with much C++ history, but something tells me
this is akin to trepidation that surrounded C++ during it's inception?
IOW, is this 'old school' rhetoric or ..... How do you refute this
argument?


What is the argument? In fact, what is the advice? As I understand it,
the advice is not to use the STL because it is outdated. Programs
should use the container and iterator types as defined in the Standard
Library in order to be current, to be portable and to be assured of
timely bug fixes if needed.

If the advice really is to avoid the STL and STL-derived libraries,
then what is the proposed alternative? C arrays? Everyone to write
their own container classes? In what ways are either of those two
alternatives more attractive than using an existing library?

Greg

Oct 11 '05 #7
[Dave Rahardja]
|| However, there are
|| valid reasons not to use STL, especially if you live in the embedded
world
|| where dynamic memory usage is frowned upon, due to the significant
risk of
|| heap fragmentation. I can't use STL containers in my embedded
project because
|| of that very reason.

[Kristo]
|| But what's stopping you from calling reserve() during the
initialization phase?
In the academic world. Advisors depend on grants, grants makes the
university look 'good'; the graduate students get to deal with the
'science project' received from the outside world; this make the
advsior look good, the student (us) get a pat on the back and our
Phd/Masters becomes more appealing. The folks in the embedded wold
are the ones who generally claim limited 'STL' on a continuum. This
brings about slides with the bullet in question. So now consider an
approach to a Discrete Fourier Transform (DFT):

// the 'C' way.
#include <cstdlib>
#include <cmath>
#include <iostream>
#include <numeric>
#include <functional>
#include <vector>
#include <algorithm>
using namespace std;

enum {
TRUE=1,
FALSE=0
};

/*
Direct fourier transform
dir = 1 gives forward transform
dir = -1 gives reverse transform
*/
int DFT(int dir,int m,double *x1,double *y1)
{
long i,k;
double arg;
double cosarg,sinarg;
double *x2=NULL,*y2=NU LL;

x2 = (double *)malloc(m*size of(double));
y2 = (double *)malloc(m*size of(double));
if (x2 == NULL || y2 == NULL)
return(FALSE);

for (i=0;i<m;i++) {
x2[i] = 0;
y2[i] = 0;
arg = - dir * 2.0 * 3.141592654 * (double)i / (double)m;
for (k=0;k<m;k++) {
cosarg = cos(k * arg);
sinarg = sin(k * arg);
x2[i] += (x1[k] * cosarg - y1[k] * sinarg);
y2[i] += (x1[k] * sinarg + y1[k] * cosarg);
}
}

/* Copy the data back */
if (dir == 1) {
for (i=0;i<m;i++) {
x1[i] = x2[i] / (double)m;
y1[i] = y2[i] / (double)m;
}
} else {
for (i=0;i<m;i++) {
x1[i] = x2[i];
y1[i] = y2[i];
}
}

free(x2);
free(y2);
return(TRUE);
}

I'm now a fan of the STL, I'm now programmed to think STL. STL
implementations of FFT/IFFTs etc are - nonexistent (I have yet to find
one). Having said, lets experiment with an STL version of the DFT
above:

class MinusWithCoeff {
public:
MinusWithCoeff( double arg_) : i(0), arg(arg_) {}
pair<double, double> operator()(doub le x, double y)
{
double cosarg = cos(i * arg);
double sinarg = sin(i * arg);
++i;
pair<double, double> res;
res.first = x*cosarg-y*sinarg;
res.second = x*sinarg + y*cosarg;
return res;
}
private:
long i;
double arg;
};

template <typename T>
class pair_plus {
public:
pair<T, T> operator()(cons t pair<T, T>& lh, const pair<T, T>& rh)
{
pair<T, T> res;
res.first=lh.fi rst+rh.first;
res.second=lh.s econd+rh.second ;
return res;
}
};

/*
Direct fourier transform
dir = 1 gives forward transform
dir = -1 gives reverse transform
*/
int DFT_CPP(int dir, int m, double *x1, double *y1)
{
long i, k;
double arg;
vector<double> x2(m), y2(m);

for (i=0; i<m; i++) {
arg = - dir * 2.0 * 3.141592654 * double(i) / double(m);
pair<double, double> res = inner_product(x 1, x1+m, y1, pair<double,
double>(0., 0.),
pair_plus<doubl e>(), MinusWithCoeff( arg));
x2[i]=res.first;
y2[i]=res.second;
}

/* Copy the data back */
if (dir == 1) {
for (i=0;i<m;i++) {
x1[i] = x2[i] / double(m);
y1[i] = y2[i] / double(m);
}
} else {
copy(x2.begin() , x2.end(), x1);
copy(y2.begin() , y2.end(), y1);
}
return(TRUE);
}

class TestUnit {
public:
void test_new_dft(vo id)
{
int m=2;
for (int dir=-1; dir<=1; dir+=2) {
vector<double> x1(m, 17.), y1(m, 18.);
vector<double> x2(m, 17.), y2(m, 18.);
if (!DFT_CPP(dir, m, &x1[0], &y1[0]) ||
!DFT(dir, m, &x2[0], &y2[0]) ||
!equal(x1, x2) || !equal(y1, y2))
cout<<"Test failed with dir="<<dir<<end l;
else
cout<<"Test passed with dir="<<dir<<end l;
}
}
private:
bool equal(const vector<double>& rh, const vector<double>& lh) {
static const double eps=1e-14;
vector<double>: :const_iterator p, q;
for (p=rh.begin(), q=lh.begin(); p!=rh.end(), q!=lh.end(); ++p,
++q)
if (fabs(*p-*q)>eps)
return false;
return p==rh.end() && q==lh.end();
}
};

int main()
{
TestUnit().test _new_dft();
return EXIT_SUCCESS;
}
Granted, I haven't benchmarked this, I suspect it's slow compared to
the C style approach but from the looks of it, one's head is liable to
spin. Of coruse BiG O factors in here and might might make things slow
but nowithstanding executing speed, I don't see the code bloat.
Complexity, yes!!

Oct 11 '05 #8
ma******@gmail. com wrote:
[Dave Rahardja]
|| However, there are
|| valid reasons not to use STL, especially if you live in the embedded
world
|| where dynamic memory usage is frowned upon, due to the significant
risk of
|| heap fragmentation. I can't use STL containers in my embedded
project because
|| of that very reason.

[Kristo]
|| But what's stopping you from calling reserve() during the
initialization phase?

[snip] So now consider an
approach to a Discrete Fourier Transform (DFT):
[the 'C' way snipped]
I'm now a fan of the STL, I'm now programmed to think STL. STL
implementations of FFT/IFFTs etc are - nonexistent (I have yet to find
one). Having said, lets experiment with an STL version of the DFT
above:

class MinusWithCoeff {
public:
MinusWithCoeff( double arg_) : i(0), arg(arg_) {}
pair<double, double> operator()(doub le x, double y)
{
double cosarg = cos(i * arg);
double sinarg = sin(i * arg);
++i;
pair<double, double> res;
res.first = x*cosarg-y*sinarg;
res.second = x*sinarg + y*cosarg;
return res;
}
private:
long i;
double arg;
};

template <typename T>
class pair_plus {
public:
pair<T, T> operator()(cons t pair<T, T>& lh, const pair<T, T>& rh)
{
pair<T, T> res;
res.first=lh.fi rst+rh.first;
res.second=lh.s econd+rh.second ;
return res;
}
};

/*
Direct fourier transform
dir = 1 gives forward transform
dir = -1 gives reverse transform
*/
int DFT_CPP(int dir, int m, double *x1, double *y1)
{
long i, k;
double arg;
vector<double> x2(m), y2(m);

for (i=0; i<m; i++) {
arg = - dir * 2.0 * 3.141592654 * double(i) / double(m);
pair<double, double> res = inner_product(x 1, x1+m, y1, pair<double,
double>(0., 0.),
pair_plus<doubl e>(), MinusWithCoeff( arg));
x2[i]=res.first;
y2[i]=res.second;
}

/* Copy the data back */
if (dir == 1) {
for (i=0;i<m;i++) {
x1[i] = x2[i] / double(m);
y1[i] = y2[i] / double(m);
}
} else {
copy(x2.begin() , x2.end(), x1);
copy(y2.begin() , y2.end(), y1);
}
return(TRUE);
}
[class TestUnit snipped]
Granted, I haven't benchmarked this, I suspect it's slow compared to
the C style approach but from the looks of it, one's head is liable to
spin. Of coruse BiG O factors in here and might might make things slow
but nowithstanding executing speed, I don't see the code bloat.
Complexity, yes!!


You make it look so unnatural. Consider the following two versions:

A simple straight forward adaptation of your code just movin to complex
numbers:

#include <cstdlib>
#include <cmath>
#include <iostream>
#include <numeric>
#include <functional>
#include <vector>
#include <algorithm>
#include <complex>

typedef double real_number;
typedef std::complex< real_number > complex_number;
typedef std::vector< complex_number > complex_vector;

void DFT( bool do_forward, complex_vector & z ) {
typedef complex_vector: :size_type size_type;

const real_number sign ( do_forward ? 1.0 : -1.0 );
const size_type length = z.size();

// allocate and initialize result
complex_vector result ( length, 0.0 );

// do matrix multiplication
for ( size_type i = 0; i < length; ++ i ) {
real_number arg =
- sign * 2.0 * 3.141592654 *
static_cast<rea l_number>(i)/ static_cast<rea l_number>( length );
for ( size_type k = 0; k < length; ++ k ) {
complex_number coefficient_ik
( std::cos( k * arg ), std::sin( k * arg ) );
result[i] += z[k] * coefficient_ik;
}
}

// rescale if forward
if ( do_forward ) {
for ( size_type i = 0; i < length; ++ i ) {
result[i] /= static_cast<rea l_number>( length );
}
}

// copy data back (swap is fast!)
z.swap( result );
}
A version where the coefficients of the transform are realized by fake
vectors:
#include <cstdlib>
#include <cmath>
#include <iostream>
#include <numeric>
#include <functional>
#include <vector>
#include <algorithm>
#include <complex>
#include <iterator>

typedef double real_number;
typedef std::complex< real_number > complex_number;
typedef std::vector< complex_number > complex_vector;

class FFT_Pseudoitera tor
: public std::iterator< std::input_iter ator_tag,
complex_number,
std::ptrdiff_t,
complex_number const *,
complex_number const &>
{

typedef complex_vector: :size_type size_type;

real_number arg;
size_type k;

public:

FFT_Pseudoitera tor ( real_number sign, size_type i, size_type length )
: arg ( - sign * 2.0 * 3.141592654 * static_cast<rea l_number>(i)
/ static_cast<rea l_number>( length ) )
, k ( 0 )
{}

complex_number operator* ( void ) const {
return ( complex_number ( std::cos( k * arg ), std::sin( k * arg ) ) );
}

FFT_Pseudoitera tor & operator++ ( void ) {
++ k;
return( *this );
}

FFT_Pseudoitera tor operator++ ( int ) {
FFT_Pseudoitera tor dummy ( *this );
++ k;
return( dummy );
}

};
void DFT( bool do_forward, complex_vector & z ) {
typedef complex_vector: :size_type size_type;

const real_number sign ( do_forward ? 1.0 : -1.0 );
const size_type length = z.size();

// allocate result
complex_vector result;
result.reserve( length );

// do matrix multiplication
for ( size_type i = 0; i < length; ++ i ) {
FFT_Pseudoitera tor coefficient_ite r ( sign, i, length );
result.push_bac k( std::inner_prod uct( z.begin(), z.end(),
coefficient_ite r,
complex_number( 0.0) ) );
}

// rescale if forward
if ( do_forward ) {
for ( size_type i = 0; i < length; ++ i ) {
result[i] /= static_cast<rea l_number>( length );
}
}

// copy data back (swap is fast!)
z.swap( result );
}
int main ( void ) {
complex_vector z;
z.push_back( complex_number( 0.5, 2 ) );
z.push_back( complex_number( 0.7, 1.4 ) );
z.push_back( complex_number( 0.9, -2.1 ) );
z.push_back( complex_number( 0.9, -2.1 ) );
z.push_back( complex_number( -1.2, 1.1 ) );

DFT( true, z );
std::copy( z.begin(), z.end(),
std::ostream_it erator< complex_number >( std::cout, "\n" ) );
DFT( false, z );
std::copy( z.begin(), z.end(),
std::ostream_it erator< complex_number >( std::cout, "\n" ) );
}
I think the C++ versions are much more easy to understand -- after all you
can see the complex arithmetic. Also, I would be surprised if they were
actually slower than the C version. After all this is a pretty straight
forward translation.

Best

Kai-Uwe Bux
Oct 12 '05 #9
|| I think the C++ versions are much more easy to understand -- after
all you
|| can see the complex arithmetic. Also, I would be surprised if they
were
|| actually slower than the C version. After all this is a pretty
straight
|| forward translation.

Impressive. I suspect it's time to reivew std::complex and iterators
in depth. I ended up perusing those chapters (oso lightly) in
Josuttis. Do you have anything like this for FFT and IFFT ;) Makes me
think my custom versions (at the lab right now) are also unnatural.

Thanks a lot.

Oct 12 '05 #10

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

Similar topics

12
5475
by: Fabian Knopf | last post by:
Hi @ll, my IBM DB2 server runs with 60% Cpu Usage but no task has to be done. Why this ??? Cu, Fabian
8
21909
by: Grant Richard | last post by:
Using the TcpListener and TcpClient I created a program that just sends and receives a short string - over and over again. The program is fine until it gets to around 1500 to 1800 messages. At that time, I get a SocketException with the message "Only one usage of each socket address (protocol/network address/port) is normally permitted". This happen if you use localhost or between two distinct computers. And, for a period of time after the...
7
4969
by: LBT | last post by:
I have a window service written using VB.NET. This window service will scan folders for file and grab the file content to be inserted to SQL Server on file detection. There are altogether 18 folders to be watched. Each folder is assigned with a timer for watching purpose. Hence there will be 18 timers and each timer is set to elapse on every second. Problem here, once the window service is installed and started, the CPU usage is very...
2
1622
by: Fish | last post by:
I have been researching the correct way to organize my solution so that it makes best use of VB.NET inherent ability to manage resources such as objects. My solution contains 2 projects and the main problem is that the mem usage continues to grow until the Service stops responding. I have received advice to: "create those objects at a class level; instantiate them when the service starts, and dispose of them when the service ends. Then...
1
1992
by: Larry Neylon | last post by:
Hi, I'm working on a VBScript application on IIS6 and I'm looking for some advice about the best way of replacing or improving session variable usage. The application is in a secure extranet environment. Currently the application has a search customers page with 10 search fields which list the results below the search fields. The requirement for this screen was that the user could return to this result page at any point from any page...
4
1673
by: Mark | last post by:
I want to create a collection class that will be strongly typed (store a specific object type), be keyed with a case insensitive string, and be able to access objects stored by index, or sequentially (in the order stored) via "For Each". I know I could code this from scratch - or derived from a number of framework classes, but I'm not sure of the pros/cons of various possibilities. I'd like to use some of the new Generics - they are...
6
2848
by: John | last post by:
I want to understand the usage of _SP in turbo C. Is _SP the stack pointer register of the CPU? That means _SP should point to the top of the procedure call stack when we make function calls? I assume _SP is only useful when making function calls here. Here's the program I wrote to test out how _SP behaves, but the result is main sp=-10 func1 sp=-14
0
3080
by: greg.novak | last post by:
I am using Python to process particle data from a physics simulation. There are about 15 MB of data associated with each simulation, but there are many simulations. I read the data from each simulation into Numpy arrays and do a simple calculation on them that involves a few eigenvalues of small matricies and quite a number of temporary arrays. I had assumed that that generating lots of temporary arrays would make my program run slowly,...
1
1689
by: Julian Moorhouse | last post by:
Hi, I'm trying to analyse my vb.net program which is going to do some processing on a web server. I'm using vb.net 1.1 My ISP says he will kill my program if it uses 100% cpu usage for a more than a few seconds. I've tried the CLR Profiler and another free profiler, but none show
0
8590
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
9072
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
8947
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...
0
8786
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...
1
6453
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
4321
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...
0
4547
by: adsilva | last post by:
A Windows Forms form does not have the event Unload, like VB6. What one acts like?
1
2964
by: 6302768590 | last post by:
Hai team i want code for transfer the data from one system to another through IP address by using C# our system has to for every 5mins then we have to update the data what the data is updated we have to send another system
3
1950
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.