2013-11-23 6 views
0

Я реализую клиентский сервер, используя общую память POSIX и неназванные семафоры. Предполагается, что сервер будет обрабатывать несколько клиентов одновременно. Код работает с одним клиентом, но не с несколькими клиентами. Операции POSIX управляются,posix shared memory для нескольких клиентов

enum { MAX_MSG = 256 }; 
enum { CLIENT_SEM,   // semaphore is 1 if server is available for use by client  
     MSG_FOR_DAEMON_SEM, // semaphore is 1 if shm contains msg for daemon  
     MSG_FOR_CLIENT_SEM, // semaphore is 1 if shm contains msg for client  
     MSG_FOR_SERVER_SEM, // semaphore is 1 if shm contains msg for server  
     N_SEMS }; 

typedef struct {  
    sem_t sems[N_SEMS]; // semaphore sent for sync 
    pid_t clientPid; // pid of current client  
    char msg[MAX_MSG]; // current message being sent  
    int max_matrix_size; //max rows a square matrix can have 
}Comm; 

// server calls setup_comm with doCreate=1 and creates shared mem of size max_clients * sizeof(Comm) 
// client calls setup_comm with doCreate=0 and in return gets the mmap pointer to the shared memory created by the server 
Comm* setup_comm(const char *shmPosixName, int doCreate, int max_clients); 

Вопрос заключается в том, чтобы работать с несколькими клиентами, мы должны поддерживать массив структуры Comm; то есть Comm[max_clients] вместо того, что я использую в настоящее время (единственная структура Comm)? И для каждого клиента серверу необходимо управлять массивом Comm и возвращать подходящий элемент из этого массива клиенту. Клиент, в свою очередь, будет использовать этот блок для синхронизации операций над семафорами в элементе Comm? Или несколько клиентов могут обрабатываться с единой структурой Comm?

ответ

0

Если вы используете один экземпляр Comm, тогда сервер плюс все клиенты будут использовать эту структуру для всей связи. Это подразумевает sem_wait/sem_post вокруг всех доступов, в то время как перетасовка clientPid и остальная часть структурных переменных соответствуют текущему активному клиенту.

Казалось бы, более просто выделить массив структур, при этом сервер будет манипулировать целым рядом структур, в то время как каждый ребенок будет иметь доступ только к одному из элементов массива (предоставляется, он может видеть их всех, но будет иметь дело только с один). Затем каждый набор семафоров на элемент Comm будет использоваться для координации связи между сервером и конкретным клиентом. Предположение здесь заключается в том, что у клиентов нет связи между собой.

Смежные вопросы