gpt4 book ai didi

c - 使用消息队列的 C 语言服务器和客户端(无套接字代码)

转载 作者:行者123 更新时间:2023-11-30 17:08:22 24 4
gpt4 key购买 nike

我正在尝试在客户端和服务器程序中实现线程、二进制信号量和消息队列。一切正常,除了我的服务器中将响应发送回客户端的回复之外。当我取消注释回复时,服务器在收到消息后无限循环。

它们都使用 message.h 头文件,该文件是一个包含以下内容的结构:内容(字符)、id(int)和mtype(int)。

//服务器.c

#include <stdio.h>
#include <stdlib.h>
#include <sys/types.h>
#include <sys/msg.h>
#include <sys/ipc.h>
#include <errno.h>
#include <unistd.h>
#include <pthread.h>
#include <semaphore.h>

#include "message.h"


int sqid, cqid, pid;
msg m, n;
sem_t sem_var;
key_t key;


void requestSem();
void setSem();
void unlockSem();
void reply();
void readQueue();
void listener(void *ptr);


int main() {

key = ftok(".", 'z');
sqid = msgget(key, IPC_CREAT | 0600);

if(sqid < 0) {
perror("Error creating the message queue.\n");
}

pthread_t thread1;
pthread_t thread2;
pthread_t thread3;

char *msg1 = "Thread 1";
char *msg2 = "Thread 2";
char *msg3 = "Thread 3";

pthread_create(&thread1, NULL, (void *) &listener, (void *) msg1);
pthread_create(&thread2, NULL, (void *) &listener, (void *) msg2);
pthread_create(&thread3, NULL, (void *) &listener, (void *) msg3);

pthread_join(thread1, NULL);
pthread_join(thread2, NULL);
pthread_join(thread3, NULL);

}

// always listen for messages

void listener(void *ptr) {

while (1) {

requestSem();
setSem();
readQueue();
unlockSem();
//reply();

}
}

void readQueue()
{

// print the proccess ID and thread ID

printf("Process ID: %d, Thread ID: %d\n", getpid(), pthread_self());

// receive message

if(msgrcv(sqid,&m,sizeof(struct msg),0,0) < 0) {
perror("Error receiving a message.\n");
}
printf("Message was received...\n");
fprintf(stderr, "The contents are: %s\n", &m.contents);
fprintf(stderr, "The client's ID is: %d\n", (&m)->id);
fprintf(stderr, "The thread's ID is: %d\n", pthread_self());

}




void requestSem()
{
// request semaphore (lock)

sem_init(&sem_var, 1, 1);

printf("Semaphore requested.\n");

}

void setSem()
{
// lock semaphore

sem_wait(&sem_var);

printf("Semaphore set.\n");

}

void unlockSem()
{
// unlock semaphore

sem_post(&sem_var);

printf("Semaphore unlocked.\n");
}

void reply()
{
// send reply

printf("got here\n");

pid = (&m)->id;

cqid = msgget(pid, 0600);

n.contents = (&m)->contents;
n.mtype = 0;
n.id = getpid();

if(msgsnd(cqid, &n,sizeof(struct msg),0) < 0) {
perror("Msg send error");
}

msgctl(sqid,IPC_RMID,NULL);

}

//客户端.c

#include <stdio.h>
#include <stdlib.h>
#include <sys/types.h>
#include <unistd.h>
#include <sys/msg.h>
#include <sys/ipc.h>
#include <errno.h>
#include <pthread.h>
#include <semaphore.h>

#include "message.h"



int main() {

// initialize variables

int mqid, rqid;
msg m;
key_t key;

// initialize message

int pid;
pid = getpid();
m.id = pid;
m.mtype = 1;

// create message queue and response queue

key = ftok(".", 'z');
mqid = msgget(key, 0600);
rqid = msgget(pid, IPC_CREAT | 0600);

if(mqid < 0) {
perror("Error creating the message queue.\n");
}

if (rqid < 0)
{
perror("Error creating the message queue.\n");
}

// loop forever, can send as many messages as you want

while(1) {

fprintf(stderr, "The ID of the client is: %d\n", pid);

// prompt for user input

printf("Enter one character to send: \n");
scanf("%s", &m.contents);

// send message

if(msgsnd(mqid, &m,sizeof(struct msg), 1) < 0) {
perror("Error sending the message.");
}

//msgctl(mqid,IPC_RMID,NULL);

printf("Message was sent successfully!\n");

// receive response

printf("Waiting for a reply...\n");

if(msgrcv(rqid,&m,sizeof(msg), 0, 0) < 0)
{
perror("Error receiving a message.\n");
}

printf("Message was received.\n");
fprintf(stderr, "The contents are: %s\n", &m.contents);

}
}

预先感谢您的帮助。当回复在服务器的监听器中被注释掉时,一切都会按预期运行。取消注释会产生无限循环。

最佳答案

服务器永远不会退出的原因是因为每个线程都有一个

while(1)

循环并且无法退出该循环

关于c - 使用消息队列的 C 语言服务器和客户端(无套接字代码),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33704351/

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