Jedno pitanje u vezi multiprocessinga i shared memory i network programming.
Igram se malo sa socketima u c++ i sad me zanima da li bi mogao recimo kad mi se client spoji i dobijem "client socket" pomocu kojeg mogu odgovarati clientu, da li bi ja mogao taj "client socket" staviti negdje na shared memory i onda pokrenuti drugi proces koji bi s njim komunicirao. Probao sam sa boost-om ali nista, on dohvati taj "client socket" ali kad hocu poslati poruku ili procitati s njega, nula bodova. Dok ako taj isti "client socket" ostavim na istom procesu, onda je sve ok.
U principu sam uspio, ali nije dovoljno. Uspio sam postici da pokrenem drugi process, dohvatim taj clientSocket i s njim onda mogu raditi.
Uglavnom sam to sredio s funkcijom CreateFileMapping(INVALID_HANDLE_VALUE, NULL, PAGE_READWRITE, 0, size, memoryName.c_str());
No problem je kod ovoga sto recimo ako imam
class A{
class B* -> neki pointer na drugi neki objekt
}
Ja mogu dohvatiti ovu classu A na drugom processu, ali ne mogu dohvatiti classu B.
Vidio sam svakakve sad pojmove na internetu, serialization,allocation.
Ono sto mi se najlakse cinilo je korsterci boost::interprocess, no s njim sam uspio samo sherati neke jednostavne,primitivne vrijednosti.
Da li mi moze netko pomoci, usmjeriti mi kako da iskoristim boost da sheram neke kompleksne objekte ili bilo koji drugi nacin
EDIT
struct B
{
std::vector<int> lista;
};
if (cArgs == 1) { //Parent process
//Remove shared memory on construction and destruction
struct shm_remove
{
shm_remove() { shared_memory_object::remove("MySharedMemory"); }
~shm_remove() { shared_memory_object::remove("MySharedMemory"); }
} remover;
//Create a shared memory object.
shared_memory_object shm(create_only, "MySharedMemory", read_write);
//Set size
shm.truncate(1000);
//Map the whole shared memory in this process
mapped_region region(shm, read_write);
//Write all the memory to 1
B* ada = new B();
CopyMemory(region.get_address(), ada, sizeof(B));
parentProcess();
std::cout << "zapocelo je " << std::endl;
int index = 1;
while (true)
{
((B*)region.get_address())->lista.push_back(index);
++index;
}
}
else
{
//Open already created shared memory object.
shared_memory_object shm(open_only, "MySharedMemory", read_only);
//Map the whole shared memory in this process
mapped_region region(shm, read_only);
//Check that memory was initialized to 1
HANDLE mem = region.get_address();
while(true)
{
std::cout << ((B*)mem)->lista.at(0) << std::endl; -> ovo ne uspije procitati
}
}