473,698 Members | 2,300 Online
Bytes | Software Development & Data Engineering Community
+ Post

Home Posts Topics Members FAQ

Problem with offset based linked list

Hi,

I am using Linux + SysV Shared memory (sorry, but my question is all
about offset + pointers and not about linux/IPC) and hence use
offset's instead on pointers to store the linked list in the shared
memory. I run fedora 9 and gcc 4.2. I am able to insert values in to
the list, remove values from the list, but the problem is in
traversing the list. Atlease one or 2 list nodes disappear when
traversing from the base of the list or the shared memory.

PS: Don't get carried away because of PROC1 macro. It's just used to
compile the same code to two different processes one that creates,
inserts & destroys the list & creates & destroys shared memory & the
other one simply attaches to the shared memory and traverses the
linked list created by the process that is compiled using PROC1 macro
defined. So to compile:
gcc -g -O -D PROC1 proc1 shlist.c
gcc -g -O -o proc2 shlist.c

now proc1 creates shared memory & destroys it and also creates &
destroys linked list. Where as proc2 just attaches (and detaches
finally) to shared memory and just traverses the list and prints the
value in each list element.

Thanks.

Kalyan

Below is the complete code (shlist.c) :

#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include <errno.h>
#include <sys/types.h>
#include <unistd.h>
#include <fcntl.h>
#include <sys/ipc.h>
#include <sys/shm.h>
#include <sys/stat.h>

int open_shared_mem ory(key_t shm_key,size_t shm_sz);
void* attach_shared_m emory(int shm_id);
void detach_shared_m emory(const void *mem);
void destroy_shared_ memory(int shm_id);

#define SHMEM_CREAT (IPC_CREAT|IPC_ EXCL|0644)
#define SHMEM_OPEN (IPC_CREAT|0644 )

int open_shared_mem ory(key_t shm_key,size_t shm_sz)
{
size_t shm_size = 1024;
int shm_id = -2; /*some invalid id number*/

if (shm_key == IPC_PRIVATE) abort();
if (shm_sz < 1024) {
fprintf(stderr, "Warning: Shared memory size is defaulted to 1024
bytes\n");
} else {
shm_size = shm_sz;
}

shm_id = shmget(shm_key, shm_size,SHMEM_ CREAT);
if (shm_id == -1) {
shm_id = shmget(shm_key, shm_size,SHMEM_ OPEN);
if (shm_id == -1) {
fprintf(stderr, "Unable to create/open shared memory with key value:
%lu\n",(unsigne d long) shm_key);
fprintf(stderr, "Error occured is \"%s\"\n",strer ror(errno));
return -1;
}
}
return shm_id;
}

void* attach_shared_m emory(int shm_id)
{
void *mem = shmat(shm_id,NU LL,0);
if (mem == (void *) -1) return NULL;
return mem;
}

void detach_shared_m emory(const void *mem)
{
shmdt(mem);
}

void destroy_shared_ memory(int shm_id)
{
shmctl(shm_id,I PC_RMID,(struct shmid_ds *) 0);
}
typedef long OffsetPtr;

extern unsigned char* base;

#define OFFSET_BASE(ptr ) \
if (ptr != NULL) base = (unsigned char*) ptr;

#define GET_OFFSET(ptr) \
((long) ((unsigned char*) ptr - base))

#define GET_POINTER(off ) \
((void*) (base + off))

#define IS_VALID_POINTE R(ptr) \
(base < (unsigned char*) (ptr))
unsigned char* base = 0;

static int count = 0;

typedef struct {
int value;
OffsetPtr next;
} IntList;

void InitList(IntLis t *list);
void InsertHead(IntL ist *list,int value);
void RemoveHead(IntL ist *list,int *removedValue);
void DestroyList(Int List *list);

void InitList(IntLis t *list)
{
if (list == NULL || !list) return;
OFFSET_BASE(lis t);
list->next = -1;
list->value = 0;
}

void InsertHead(IntL ist *list,int value)
{
IntList *newList,*nnode ;

if (list == NULL || !list) abort();

newList = (IntList *) (base + (count *sizeof(IntList )));

if (!newList || newList == NULL)
abort();

newList->value = value;
if (list->next == -1) newList->next = -1;
else newList->next = list->next;
list->next = GET_OFFSET(newL ist);
++count;
}

void RemoveHead(IntL ist *list,int *removedValue)
{
IntList *node,*nnode;
OffsetPtr next;

if (list == NULL || !list) return;

node = (IntList *) GET_POINTER(lis t->next);
nnode = (IntList *) GET_POINTER(nod e->next);
list->next = GET_OFFSET(nnod e);
*removedValue = node->value;
node->next = -1;
--count;
}

void DestroyList(Int List *list)
{
int val;
while (list->next != -1)
{
RemoveHead(list ,&val);
printf("Removed : %d\n",val);
}
list->next = -1;
}

int main(void)
{
IntList *myList;
IntList *node;
int i,val,shm_id;

shm_id = open_shared_mem ory(1511,4096);
if (shm_id == -1) return -errno;
base = attach_shared_m emory(shm_id);
myList = (IntList *) base;
#ifdef PROC1
InitList(myList );
for (i = 0 ; i < 20; i++) {
printf("Inserti ng :%d\n",(i + 1));
InsertHead(myLi st,(i + 1));
}
#endif
node = (IntList *) base;
while (node->next)
{
printf("%d ",node->value);
node = (IntList *) GET_POINTER(nod e->next);
}
printf("\n");
#ifndef PROC1
detach_shared_m emory((const void *) base);
#endif
#ifdef PROC1
printf("Press enter key to quit ...");
getchar();
DestroyList(myL ist);
myList->next = -1;
detach_shared_m emory((const void *) base);
destroy_shared_ memory(shm_id);
#endif
return 0;
}

Aug 25 '08 #1
12 4036
kalyan <rk**********@g mail.comwrites:
I am using Linux + SysV Shared memory (sorry, but my question is all
about offset + pointers and not about linux/IPC) and hence use
offset's instead on pointers to store the linked list in the shared
memory.
You don't need to do that. One you have a pointer it is a pointer.
No need for indexes. If there some plan to cope with moving lists
from one place to another? That might need offsets.
I run fedora 9 and gcc 4.2. I am able to insert values in to
the list, remove values from the list, but the problem is in
traversing the list. Atlease one or 2 list nodes disappear when
traversing from the base of the list or the shared memory.
I think the problem is that you have tied yourself up using these
indexes. For example, in the first InsertHead operation, list and
newlist refer to the same place.

If you need to use indexes (not obvious yet) it is much simpler to
make base a pointer to an array of nodes and just index into it -- not
messy pointer arithmetic. Remove for a moment the shared memory stuff
and just write the code to add an remove elements from linked list
using a declared array of nodes. A debugger might help you see the
confusion you have over the first node.

Then, put the shared memory back in and you will be up and running.

<snip>
Below is the complete code (shlist.c) :
A few comments...
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include <errno.h>
<snip>
typedef long OffsetPtr;

extern unsigned char* base;

#define OFFSET_BASE(ptr ) \
if (ptr != NULL) base = (unsigned char*) ptr;

#define GET_OFFSET(ptr) \
((long) ((unsigned char*) ptr - base))

#define GET_POINTER(off ) \
((void*) (base + off))
Always fully parenthesise macro arguments: (ptr). I think all is well
but I have to check all the uses one by one to be sure. In fact,
while you are debugging, I'd write all these as functions.
#define IS_VALID_POINTE R(ptr) \
(base < (unsigned char*) (ptr))
unsigned char* base = 0;

static int count = 0;

typedef struct {
int value;
OffsetPtr next;
} IntList;
Life would be easier if base were declared:

IntList *base;

so base[0], base[1] are the nodes.
void InitList(IntLis t *list);
void InsertHead(IntL ist *list,int value);
void RemoveHead(IntL ist *list,int *removedValue);
void DestroyList(Int List *list);

void InitList(IntLis t *list)
{
if (list == NULL || !list) return;
Either half of the || is enough. This confused me for a while!
OFFSET_BASE(lis t);
list->next = -1;
list->value = 0;
}

void InsertHead(IntL ist *list,int value)
{
IntList *newList,*nnode ;

if (list == NULL || !list) abort();

newList = (IntList *) (base + (count *sizeof(IntList )));

if (!newList || newList == NULL)
abort();

newList->value = value;
if (list->next == -1) newList->next = -1;
else newList->next = list->next;
This if is just the same as: newList->next = list->next;
list->next = GET_OFFSET(newL ist);
++count;
}
<snip>

--
Ben.
Aug 25 '08 #2
Ben Bacarisse <be********@bsb .me.ukwrites:
kalyan <rk**********@g mail.comwrites:
I am using Linux + SysV Shared memory (sorry, but my question is all
about offset + pointers and not about linux/IPC) and hence use
offset's instead on pointers to store the linked list in the shared
memory.

You don't need to do that. One you have a pointer it is a pointer.
No need for indexes. If there some plan to cope with moving lists
from one place to another? That might need offsets.
Shared memory is not guaranteed to be at the same address in all process
mapping them; it's not moving but the effect is the same.

Yours,

--
Jean-Marc
Aug 25 '08 #3
On Aug 25, 6:19*pm, Jean-Marc Bourguet <j...@bourguet. orgwrote:
Ben Bacarisse <ben.use...@bsb .me.ukwrites:
kalyan <rkalyanku...@g mail.comwrites:
I am using Linux + SysV Shared memory (sorry, but my question is all
about offset + pointers and not about linux/IPC) and hence use
offset's instead on pointers to store the linked list in the shared
memory.
You don't need to do that. *One you have a pointer it is a pointer.
No need for indexes. *If there some plan to cope with moving lists
from one place to another? *That might need offsets.

Shared memory is not guaranteed to be at the same address in all process
mapping them; it's not moving but the effect is the same.

Yours,

--
Jean-Marc
Hi Jean-Marc,

That's the reason why one needs to use offsets in place of pointers
when having linked lists in the shared memory?

Did you find any thing wrong in the code that I've posted? Especially
in the code that traverses the list.

Regards
kalyan
Aug 25 '08 #4
kalyan <rk**********@g mail.comwrites:
Did you find any thing wrong in the code that I've posted? Especially
in the code that traverses the list.
I've marked the message so that I can come back later but I've some other
buggy code to look at for the moment :-(

Yours,

--
Jean-Marc
Aug 25 '08 #5
Jean-Marc Bourguet <jm@bourguet.or gwrites:
Ben Bacarisse <be********@bsb .me.ukwrites:
>kalyan <rk**********@g mail.comwrites:
I am using Linux + SysV Shared memory (sorry, but my question is all
about offset + pointers and not about linux/IPC) and hence use
offset's instead on pointers to store the linked list in the shared
memory.

You don't need to do that. One you have a pointer it is a pointer.
No need for indexes. If there some plan to cope with moving lists
from one place to another? That might need offsets.

Shared memory is not guaranteed to be at the same address in all process
mapping them; it's not moving but the effect is the same.
You still don't need offsets. You need offsets (or something else) to
describe positions if the processes communicate about the memory. The
OP is free to use them if they are needed but nothing in the code
presented or the problem described did (unless I missed it).

--
Ben.
Aug 25 '08 #6
kalyan <rk**********@g mail.comwrites:
On Aug 25, 6:19¬*pm, Jean-Marc Bourguet <j...@bourguet. orgwrote:
>Ben Bacarisse <ben.use...@bsb .me.ukwrites:
kalyan <rkalyanku...@g mail.comwrites:
I am using Linux + SysV Shared memory (sorry, but my question is all
about offset + pointers and not about linux/IPC) and hence use
offset's instead on pointers to store the linked list in the shared
memory.
You don't need to do that. ¬*One you have a pointer it is a pointer.
No need for indexes. ¬*If there some plan to cope with moving lists
from one place to another? ¬*That might need offsets.

Shared memory is not guaranteed to be at the same address in all process
mapping them; it's not moving but the effect is the same.

Yours,

--
Jean-Marc
Best not to quote sigs.
Hi Jean-Marc,

That's the reason why one needs to use offsets in place of pointers
when having linked lists in the shared memory?

Did you find any thing wrong in the code that I've posted? Especially
in the code that traverses the list.
It is wrong too, but I think the main problem is in the building. If
you correct:

while (node->next)
{
printf("%d ",node->value);
node = (IntList *) GET_POINTER(nod e->next);
}

to:

node = (IntList *) base;
while (node)
{
printf("%d ",node->value);
if (node->next != -1)
node = (IntList *) GET_POINTER(nod e->next);
else node = NULL;
}

you will see that the list is circular which I don't think you intended.

--
Ben.
Aug 25 '08 #7
Ben Bacarisse <be********@bsb .me.ukwrites:
Jean-Marc Bourguet <jm@bourguet.or gwrites:
Ben Bacarisse <be********@bsb .me.ukwrites:
kalyan <rk**********@g mail.comwrites:

I am using Linux + SysV Shared memory (sorry, but my question is all
about offset + pointers and not about linux/IPC) and hence use
offset's instead on pointers to store the linked list in the shared
memory.

You don't need to do that. One you have a pointer it is a pointer.
No need for indexes. If there some plan to cope with moving lists
from one place to another? That might need offsets.
Shared memory is not guaranteed to be at the same address in all process
mapping them; it's not moving but the effect is the same.

You still don't need offsets. You need offsets (or something else) to
describe positions if the processes communicate about the memory. The
OP is free to use them if they are needed but nothing in the code
presented or the problem described did (unless I missed it).
I didn't even read the code :-) I assumed that he built the list in one
process and read it in the other, in which case if the shared memory is not
mapped in the same adress using pointers would be problematic.

Yours,

--
Jean-Marc
Aug 25 '08 #8
Jean-Marc Bourguet <jm@bourguet.or gwrites:
Ben Bacarisse <be********@bsb .me.ukwrites:
>Jean-Marc Bourguet <jm@bourguet.or gwrites:
Ben Bacarisse <be********@bsb .me.ukwrites:

kalyan <rk**********@g mail.comwrites:

I am using Linux + SysV Shared memory (sorry, but my question is all
about offset + pointers and not about linux/IPC) and hence use
offset's instead on pointers to store the linked list in the shared
memory.

You don't need to do that. One you have a pointer it is a pointer.
No need for indexes. If there some plan to cope with moving lists
from one place to another? That might need offsets.

Shared memory is not guaranteed to be at the same address in all process
mapping them; it's not moving but the effect is the same.

You still don't need offsets. You need offsets (or something else) to
describe positions if the processes communicate about the memory. The
OP is free to use them if they are needed but nothing in the code
presented or the problem described did (unless I missed it).

I didn't even read the code :-) I assumed that he built the list in one
process and read it in the other, in which case if the shared memory is not
mapped in the same adress using pointers would be problematic.
You are right. Because the errors are not related to the shared
memory I factored it out from the view of the code, but offsets are
needed. The reported errors show up (and can be fixed) in just one
process and are just C/logic errors (which I why I answered here rather
than redirecting to a *nix group).

--
Ben.
Aug 25 '08 #9
On Mon, 25 Aug 2008 03:16:22 -0700 (PDT), kalyan
<rk**********@g mail.comwrote:
>Hi,

I am using Linux + SysV Shared memory (sorry, but my question is all
about offset + pointers and not about linux/IPC) and hence use
offset's instead on pointers to store the linked list in the shared
memory. I run fedora 9 and gcc 4.2. I am able to insert values in to
the list, remove values from the list, but the problem is in
traversing the list. Atlease one or 2 list nodes disappear when
It should be only one. See comment in print loop.
>traversing from the base of the list or the shared memory.

PS: Don't get carried away because of PROC1 macro. It's just used to
compile the same code to two different processes one that creates,
inserts & destroys the list & creates & destroys shared memory & the
other one simply attaches to the shared memory and traverses the
linked list created by the process that is compiled using PROC1 macro
defined. So to compile:
gcc -g -O -D PROC1 proc1 shlist.c
gcc -g -O -o proc2 shlist.c

now proc1 creates shared memory & destroys it and also creates &
destroys linked list. Where as proc2 just attaches (and detaches
finally) to shared memory and just traverses the list and prints the
value in each list element.
Which one fails?
>
Thanks.

Kalyan

Below is the complete code (shlist.c) :

#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include <errno.h>
#include <sys/types.h>
#include <unistd.h>
#include <fcntl.h>
#include <sys/ipc.h>
#include <sys/shm.h>
#include <sys/stat.h>

int open_shared_mem ory(key_t shm_key,size_t shm_sz);
void* attach_shared_m emory(int shm_id);
void detach_shared_m emory(const void *mem);
void destroy_shared_ memory(int shm_id);

#define SHMEM_CREAT (IPC_CREAT|IPC_ EXCL|0644)
#define SHMEM_OPEN (IPC_CREAT|0644 )

int open_shared_mem ory(key_t shm_key,size_t shm_sz)
{
size_t shm_size = 1024;
int shm_id = -2; /*some invalid id number*/

if (shm_key == IPC_PRIVATE) abort();
if (shm_sz < 1024) {
fprintf(stderr, "Warning: Shared memory size is defaulted to 1024
bytes\n");
Magic numbers are the bane of maintenance. Life could be a lot
simpler in six months if you change these two statements to
if (shm_sz < shm_size) {
fprintf(stderr, "Warning: ... defaulted to %d bytes\n",
(int)shm_size);

snip
>
void destroy_shared_ memory(int shm_id)
{
shmctl(shm_id,I PC_RMID,(struct shmid_ds *) 0);
If there is a prototype in scope for this function, the third argument
would be better as NULL. 0 cast to a type other than void* is not
guaranteed to be NULL.
>}
typedef long OffsetPtr;

extern unsigned char* base;

#define OFFSET_BASE(ptr ) \
if (ptr != NULL) base = (unsigned char*) ptr;

#define GET_OFFSET(ptr) \
((long) ((unsigned char*) ptr - base))

#define GET_POINTER(off ) \
((void*) (base + off))

#define IS_VALID_POINTE R(ptr) \
(base < (unsigned char*) (ptr))
unsigned char* base = 0;

static int count = 0;

typedef struct {
int value;
OffsetPtr next;
Since OffsetPtr is not a pointer type, this is a confusing name.
>} IntList;

void InitList(IntLis t *list);
void InsertHead(IntL ist *list,int value);
void RemoveHead(IntL ist *list,int *removedValue);
void DestroyList(Int List *list);

void InitList(IntLis t *list)
{
if (list == NULL || !list) return;
Is there some reason you think the two boolean expressions can ever
evaluate to different values?
> OFFSET_BASE(lis t);
list->next = -1;
list->value = 0;
}

void InsertHead(IntL ist *list,int value)
{
IntList *newList,*nnode ;

if (list == NULL || !list) abort();

newList = (IntList *) (base + (count *sizeof(IntList )));

if (!newList || newList == NULL)
Can this if ever evaluate to true?
> abort();

newList->value = value;
if (list->next == -1) newList->next = -1;
else newList->next = list->next;
list->next = GET_OFFSET(newL ist);
++count;
}

void RemoveHead(IntL ist *list,int *removedValue)
{
IntList *node,*nnode;
OffsetPtr next;

if (list == NULL || !list) return;

node = (IntList *) GET_POINTER(lis t->next);
The cast serves no purpose.
> nnode = (IntList *) GET_POINTER(nod e->next);
list->next = GET_OFFSET(nnod e);
*removedValue = node->value;
node->next = -1;
--count;
}

void DestroyList(Int List *list)
{
int val;
while (list->next != -1)
{
RemoveHead(list ,&val);
printf("Removed : %d\n",val);
}
list->next = -1;
}

int main(void)
{
IntList *myList;
IntList *node;
int i,val,shm_id;

shm_id = open_shared_mem ory(1511,4096);
if (shm_id == -1) return -errno;
base = attach_shared_m emory(shm_id);
myList = (IntList *) base;
#ifdef PROC1
InitList(myList );
for (i = 0 ; i < 20; i++) {
printf("Inserti ng :%d\n",(i + 1));
InsertHead(myLi st,(i + 1));
}
#endif
node = (IntList *) base;
while (node->next)
You probably want the test to read (node->next != -1). As it stands,
the loop stops when node->next is 0 but before it prints the value.
And an offset of 0 is valid. You may even need to change it to a
do{}while().
> {
printf("%d ",node->value);
node = (IntList *) GET_POINTER(nod e->next);
}
printf("\n");
#ifndef PROC1
detach_shared_m emory((const void *) base);
#endif
#ifdef PROC1
printf("Press enter key to quit ...");
getchar();
DestroyList(myL ist);
myList->next = -1;
detach_shared_m emory((const void *) base);
destroy_shared_ memory(shm_id);
#endif
return 0;
}
--
Remove del for email
Aug 25 '08 #10

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

Similar topics

0
8677
by: Chris Powell | last post by:
I am using Excel/Access 2000 and have two large Excel files (25,000 rows each) that I wish to create linked tables in Access rather than importing into Access. The two source Excel files change frequently, so I want to: A) prompt the user, using a custom form, for the specific Excel files to be linked; B) create the links dynamically; C) insert the linked tables into a select query grid and include the SQL statement in the VBA...
3
4996
by: Arto Huusko | last post by:
Hello, I'm wondering about the portability and correctness of the following scenario. I have a generic doubly linked list structure, and it contains generic nodes that look like this: struct node {
5
6053
by: John N. | last post by:
Hi All, Here I have a linked list each containing a char and is double linked. Then I have a pointer to an item in that list which is the current insertion point. In this funtion, the user hits the right and left keys to move this insertion point (cursor) Here is the problem:
3
2334
by: sugaray | last post by:
hi, i have to build a linked-list which has another sturcture _score as it's data entry, so how can i sort such linked-list based on, let say, history score into proper order (descending/ascending). thanx for your help ! struct _score { float literature; float history; float sociology; };
57
4273
by: Xarky | last post by:
Hi, I am writing a linked list in the following way. struct list { struct list *next; char *mybuff; };
16
1924
by: Shwetabh | last post by:
Hi, This is a question asked to me in an interview. I haven't been able to figure out an answer for it. Please try to see what can be done about the following problem. /* I have been given two structures */ struct node { struct node *next;
11
477
by: bofh1234 | last post by:
Hello, I am having a problem with linked lists. My program is based on a client server model. The client sends some packets of data to the server. The server reads those packets and is supposed to store the data in a linked list. It looks like everything works except for the fact that the linked list only stores the last value sent and the number of nodes in the linked list is way to high. For example the client sends 4 create...
9
2254
by: Erik | last post by:
Hi, i have this struct and this linked list /* structure describing a book.*/ typedef struct { char code; char author; char title; int year; int reserved; } Book;
7
1070
by: Dave | last post by:
Hey there, having a bit of problem iterating through lists before i go on any further, here is a snip of the script. -- d = "a1 b1 c1 d1 e1 a2 b2 c2 d2 e2 a3 b3 c3 d3 e3 a4 b4 c4 d4 e4 a5 b5 c5 d5 e5" inLst = d.split() hitLst = hitNum = 0
0
8676
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
8608
by: Hystou | last post by:
Most computers default to English, but sometimes we require a different language, especially when relocating. Forgot to request a specific language before your computer shipped? No problem! You can effortlessly switch the default language on Windows 10 without reinstalling. I'll walk you through it. First, let's disable language synchronization. With a Microsoft account, language settings sync across devices. To prevent any complications,...
0
9029
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
8897
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
8867
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
7732
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...
0
5860
by: conductexam | last post by:
I have .net C# application in which I am extracting data from word file and save it in database particularly. To store word all data as it is I am converting the whole word file firstly in HTML and then checking html paragraph one by one. At the time of converting from word file to html my equations which are in the word document file was convert into image. Globals.ThisAddIn.Application.ActiveDocument.Select();...
0
4370
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...
1
3050
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

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.