gpt4 book ai didi

c - 家庭作业 - 一台服务器通过信号量和共享内存为多个客户端提供服务

转载 作者:行者123 更新时间:2023-11-30 18:07:16 24 4
gpt4 key购买 nike

大家好,我还有另一个作业问题。我必须编写一个客户端和一个服务器程序,以便服务器(具有共享内存和信号量)可以与客户端进行通信。客户端从标准输入获取数据并将其发送到服务器,服务器对其进行排序并将其发送回。问题是服务器必须为多个客户端提供服务,而我编写了它,因此它只能为一个客户端提供服务。如果有人能给我启发如何实现这一目标,那就太好了。

这是我的客户:

Client

和服务器:

#include <stdio.h>
#include <stdlib.h>
#include <sys/types.h>
#include <sys/ipc.h>
#include <sys/sem.h>
#include <sys/shm.h>
#include <errno.h>

#define SEMKEY1 6666
#define SEMKEY2 7777
#define SHMKEY 8888
#define HSIZE 128

union semun {
int val; /*value for SETVAL*/
struct semid_ds *buf; /*buffer for IPC_STAT, IPC_SET*/
unsigned short int *array; /*array for getall, setall*/
struct seminfo *__buf; /*buffer for IPC_INFO*/
};

int P(int semid){
struct sembuf occupy;
int res;

occupy.sem_num = 0;
occupy.sem_op = -1;
occupy.sem_flg = 0;
res = semop(semid, &occupy, 1);
if(res < 0){
fprintf(stderr,"P() Failed");
exit(1);
}
return res;
}

int V(int semid){
struct sembuf release;
int res;
release.sem_num = 0;
release.sem_op = 1;
release.sem_flg = 0;

res = semop(semid, &release, 1);
if(res < 0){
fprintf(stderr,"V() failed");
exit(1);
}
return res;
}

int getSem(int key){
int semid;
int errno;

if((semid = semget(key, 1, 0)) < 0){
fprintf(stderr, "getSem failed for key %d because %d \n ", key, errno);
exit(1);
}
return semid;
}

/*STRUCKT die fuer die SHARED MEMORY benutzt wird*/
typedef struct srtelem {
long elem;
int flg;
}SMSTRCKT;

int long_comp(const void *a, const void *b){
const int *ai = (const int *) a;
const int *bi = (const int *) b;

return *ai - *bi;
}

void print_hangar(long *hangar, int i){
int j;

for(j = 0; j < i; j++){
printf("%ld \n", *(hangar+j));
}
}

int main(){
int semid1, semid2, shm_id, count;
int errno, index;
SMSTRCKT *shmptr;
long hangar[HSIZE];

/*Semaphore hollen*/
semid1 = getSem(SEMKEY1);
semid2 = getSem(SEMKEY2);
count = 0;
index = 0;
printf("\t**SERVER**\n");

/*Shared memory anlegen*/
if((shm_id = shmget(SHMKEY, sizeof(SMSTRCKT), 066)) < 0){
fprintf(stderr, "SHMGET failed because of %d\n",errno);
exit(1);
}

/*Shared memory anhaengen*/
if((shmptr = (SMSTRCKT *) shmat(shm_id, NULL, 0)) == (SMSTRCKT*) -1){
fprintf(stderr,"SHMAT failed because of %d\n", errno);
exit(1);
}

/*Get date from the Client*/
while((shmptr->flg) == 1){
P(semid2);
if(shmptr->flg != 0){
printf("elem %d \n ",(int) shmptr->elem);
*(hangar+count) = shmptr->elem;
count++;
}
V(semid1);
}
qsort(hangar,count, sizeof(long),long_comp);

/*Send the result to the Client*/
while(index < count){
P(semid1);

shmptr->elem = *(hangar+index);
/*printf(" elem %ld index %d\n", shmptr->elem, index);*/
++index;

V(semid2);
}

P(semid1);
shmptr->flg++;
V(semid2);

return 0;
}

最佳答案

首先,您需要阅读有关信号量和互斥量的信息,它们将在多线程应用程序中使用,因此我认为您需要创建一个为多个客户端提供服务但使用线程等信号量的服务器。

您需要了解信号量+互斥体的工作方式和原因以及它们的差异,稍后您会发现很多有关多线程服务器的示例,并且您将被指导如何修改当前的服务器。

小教程: http://www.csc.villanova.edu/~mdamian/threads/posixsem.html

还有 2 个例子: http://www.minek.com/files/unix_examples/semab.htmlhttp://refactormycode.com/codes/1237-using-semaphores-in-c-and-forking-processes

关于c - 家庭作业 - 一台服务器通过信号量和共享内存为多个客户端提供服务,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4770381/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com