⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 main.c.svn-base

📁 可以作为Linux教学用的程序
💻 SVN-BASE
字号:
/* main.c */#include <sys/types.h>#include <sys/ipc.h>#include <sys/msg.h>#include <stdio.h>#include <stdlib.h>#include <string.h>#include <ctype.h>#include <netinet/in.h>#include <sys/time.h>#include <sys/ioctl.h>#include <unistd.h>#include <signal.h>#include "protocol.h"#include "process.h" #define MAX_CLIENTS 100#define BUFFER_SIZE 512#define MAX_CLIENT 256#define PERM 0666#define C2S_KEY 9999#define S2C_KEY 9998#define MAX_MSG_LEN 512int fd2id_flag[MAX_CLIENT];int id2fd_flag[MAX_CLIENT];int fd2id_array[MAX_CLIENT];int id2fd_array[MAX_CLIENT];int fd2id(int);int id2fd(int);static int c2s_id;static int s2c_id;typedef struct msg_data{	long type;	char text[MAX_MSG_LEN];} msg_data_t;int send_msg(int fd, const char * msg);static void init_msgs();static void delete_msgs();void sigint_handler(int);int main(){        char buffer[BUFFER_SIZE];        protocol_t in_msg;    protocol_t out_msg;        msg_data_t data_recv;    msg_data_t data_send;        tbs_init();        init_msgs();          if(signal(SIGINT, sigint_handler) == SIG_ERR ){    	perror("Cannot register singnal handler");    	tbs_end();    }	while(1) {		int id = 0;		int len = 0;		if (msgrcv(c2s_id, (void *)&data_recv, MAX_MSG_LEN, 0, 0) == -1) {		    perror("msgrcv failed with error");		    exit(-1);		}				id = data_recv.type;		printf("client process id: %d", id);		if(parse_msg(&in_msg, data_recv.text) != 0){			fprintf(stderr,"Cannot parse messege!");			continue;		}		if(process_action(id, &in_msg, &out_msg, send_msg)!=0){				continue;		}		//send msg		format_msg(&out_msg, buffer);		printf("Formatted String[%s]\n", buffer);		printf("id = %d\n", out_msg.usr_id);		len = strlen(buffer);		data_send.type = id;		strcpy(data_send.text, buffer);		msgsnd(s2c_id, &data_send, len + 1, 0);	}	tbs_end();}int send_msg(int fd, const char * msg){	int len = strlen(msg);	msg_data_t send_data;	send_data.type = fd;	printf("Formatted String[%s]\n", msg);	strcpy(send_data.text, msg);	msgsnd(s2c_id, &send_data, len + 1, 0);	return 0;}int fd2id(int i){	if(fd2id_flag[i] != 1){		return -1;	}else {		return fd2id_array[i];	}}int id2fd(int i){	if(id2fd_flag[i] != 1){		return -1;	}else {		return id2fd_array[i];	}}void sigint_handler(int sig) {	if(sig == SIGINT){		tbs_end();		delete_msgs();		printf("shutting down server ... ");		exit(0);	}	return;}void init_msgs(){    if ((c2s_id = 	msgget(C2S_KEY, PERM | IPC_CREAT)) < 0) {	perror("MSG Key");	exit(-1);    }    if ((s2c_id = 	msgget(S2C_KEY, PERM | IPC_CREAT)) < 0) {	perror("MSG Key");	exit(-1);    }}void delete_msgs(){    msgctl(c2s_id, IPC_RMID, 0);    msgctl(s2c_id, IPC_RMID, 0);}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -