可能是定时的部分有问题吧,导致客户端无法接收数据,不过我感觉思想是没错的。。。先pull上吧,以后发现错误再改
参考资料:UNP卷二
message.h
#ifndef _MESSAGE_H
#define _MESSAGE_H
#include<stdio.h>
#include<sys/msg.h>
#include<errno.h>
#include<sys/types.h>
#include<sys/stat.h>
#include<fcntl.h>
#include<unistd.h>
#include<string.h>
#define MAXLINE 100
#define RECEIVEKEY 1234
#define SENDKEY 456
struct message
{
long len;
int type;
char data[MAXLINE];
};
//这里面的mesg_send和mesg_recv都可以复用
ssize_t mesg_send(int,struct message *);
ssize_t mesg_recv(int,struct message *);
ssize_t mesg_send(int gid, struct message *mptr)
{
return(msgsnd(gid,&(mptr->type),mptr->len,0));
//这里传的是类型诶,并不是一个结构体,这样比较节省空间
}
ssize_t mesg_recv(int gid,struct message *mptr)
{
ssize_t n;
n = msgrcv(gid,&(mptr->type),MAXLINE,mptr->type,0);
mptr->len = n;
return n;
}
#endif
客户端
#include "message.h"
void client(int readgid,int writegid);
int
main(int argc, char const *argv[])
{
int readgid,writegid;
readgid = msgget(RECEIVEKEY,IPC_CREAT|644);
writegid = msgget(SENDKEY,IPC_CREAT|644);
client(readgid,writegid);
msgctl(readgid,IPC_RMID,0);
msgctl(writegid,IPC_RMID,0);
return 0;
}
void
client(int readgid,int writegid)
{
ssize_t length,n;
struct message clientmsg,receivemsg;
printf("please enter the pathname you want to send:\n");
fgets(clientmsg.data,sizeof(clientmsg.data),stdin);
length = strlen(clientmsg.data);
//这里strlen和sizeof有大不同
//这一步总是忘记,因为fgets函数会读入回车符
if(clientmsg.data[length] == '\n')
length --;
clientmsg.len = length;
clientmsg.type = 1;
mesg_send(writegid,&clientmsg);
//等待接收服务器端消息
sleep(30);
while((n = mesg_recv(readgid,&clientmsg)) > 0)
fputs(clientmsg.data,stdout);
}
服务器端
#include "message.h"
//错误一:客户端没有返回的显示
//接收数据和返回数据不能用一个消息队列的~
void server(int readgid,int writegid);
int
main(int argc, char const *argv[])
{
int readgid,writegid;
writegid = msgget(RECEIVEKEY,IPC_CREAT|644);
//客户端的写与服务器端的读是一个消息队列,这个不能弄错了~
readgid = msgget(SENDKEY,IPC_CREAT|644);
server(readgid,writegid);
return 0;
}
void
server(int readgid,int writegid)
{
//要先接收数据吧,根据type来接收
struct message servermsg;
ssize_t n,pid;
sleep(15);
servermsg.type = 1;
if((n = mesg_recv(readgid,&servermsg)) == 0)
printf("pathname missing...\n");
servermsg.data[n] = '\0';
pid = open(servermsg.data,644|O_CREAT|O_EXCL);
if(pid == -1)
{
//路径所在的文件存在
read(pid,servermsg.data,MAXLINE);
servermsg.len = strlen(servermsg.data);
mesg_send(writegid,&servermsg);
}
else
{
//请求的文件不存在
snprintf(servermsg.data + n,sizeof(servermsg.data) -n ,":can't open,%s\n",strerror(errno));
servermsg.len = strlen(servermsg.data);
mesg_send(writegid,&servermsg);
}
}