2013-12-09 2 views
-1

Я хочу обмениваться переменными между клиент-серверной программой. У меня есть сервер и 2 клиента. Я сделал SHM с shmget, но я не могу Reat переменные в клиентеОбщая память в C linux между сервером и клиентом

Сервер:

if ((nMemID=shmget(kluc, sizeof(udaje[2]), IPC_CREAT|0777))==-1) 
{ 
    perror("Nepodarilo sa vytvorit segment zdielanej pamate\n"); 
    exit(-100); 
} 

if ((shared =(udaje *)shmat(nMemID, NULL, 0))==NULL) 
{ 
    fprintf(stderr,"Nepodarilo sa pripojit na rad sprav\n"); 
    exit(-1); 
} 
shared->hlavnaNadrz=50000; 
shared->nadrz1=1200; 

Клиент:

if ((zdielanie =(udaje *)shmat(nMemID, NULL, 0))==NULL) 
{ 
    fprintf(stderr,"Nepodarilo sa pripojit na rad sprav\n"); 
    exit(-1); 
} 
data=zdielanie->hlavnaNadrz; 
+0

Не может читать или не можете прикрепить? – HAL

+0

не может читать из sharedMemor. Но в ipcs у меня есть sharedmemory, созданный 0x0000162e 62619660 fitz 777 48 1 – Patrick

+0

Если ваши клиентские и серверные программы будут обмениваться данными по сети, тогда обмен памятью между процессами не будет работать. Поскольку память распределяется на вашем сервере, а не на ваших клиентах. – EdgeCaseBerg

ответ

1

Считывание данных в цикл:

if (shmctl(shmid, SHM_LOCK, NULL) == -1) 
    { 
     printf ("Unable to lock the shared storage: Reason %s\n", strerror(errno)); 
     break; 
    } 
    ShrStruct = (struct SharedStruct *)shm; 
    if (strlen(ShrStruct->Name) && ShrStruct->EmpID != 0) 
    { 
     printf("Data Received : Name --> %s || Employee ID --> %ld\n", ShrStruct->Name, ShrStruct->EmpID); 
     memset(shm, '\0', sizeof(struct SharedStruct)); 
    } 
    if (shmctl(shmid, SHM_UNLOCK, NULL) == -1) 
    { 
     printf ("Unable to unlock the shared storage: Reason %s\n", strerror(errno)); 
     break; 
    } 
+1

Теперь он работает без разблокировки ... Я только добавляю shmget моему клиенту перед shmat, и он решил проблему. – Patrick