head.h:
1
/*
head
*/
2
#include <unistd.h>
3
#include <stdio.h>
4
#include <stdlib.h>
5
#include <
string
.h>
6
#include <sys/types.h>
7
#include <fcntl.h>
8
#include <signal.h>
9
#include <sys/stat.h>
10
11
#define
SERVER_FIFO "/tmp/server_fifo"
12
#define
LOGIN 0
13
#define
SEND 1
14
15
typedef
struct
16
{
17
int
service_type;
18
char
myfifo[
50
];
19
20
union {
21
struct
{
22
char
username[
50
];
23
}user ;
24
struct
{
25
char
name_src[
50
];
26
char
name_dst[
50
];
27
char
msg[
100
];
28
}msg;
29
} choose;
30
}Message;
31
32
typedef
struct
{
33
char
name[
50
];
34
char
fifo[
50
];
35
}User;
server.c
1
#include
"
head.h
"
2
#define
BUF_SIZE 100
3
4
int
ser_fifo;
5
int
i;
6
int
fd;
7
int
user_num ;
8
char
buffer[BUF_SIZE];
9
Message message;
10
User users[
10
];
11
12
void
init(){
13
if
(access(SERVER_FIFO, F_OK) == -
1
){
14
if
(mkfifo(SERVER_FIFO,
0777
) == -
1
){
15
perror(
"
init-access-mkfifo
"
);
16
exit(
1
);
17
}
18
}
19
20
if
((ser_fifo = open(SERVER_FIFO, O_RDONLY | O_NONBLOCK)) == -
1
){
21
perror(
"
init-open
"
);
22
exit(
1
);
23
}
24
}
25
26
27
void
sendBuffer(){
28
29
if
((fd = open(message.myfifo, O_WRONLY | O_NONBLOCK)) == -
1
){
30
perror(
"
sendBuffer-open
"
);
31
exit(
1
);
32
}
33
if
(write(fd, buffer, strlen(buffer)+
1
) == -
1
){
34
perror(
"
serndBuffer-write
"
);
35
}
36
close(fd);
37
}
38
39
void
login(){
40
for
(i =
0
; i < user_num; ++
i)
41
{
42
if
(strcmp(message.choose.user.username, users[i].name) ==
0
){
43
strcpy(buffer,
"
1,the user has existed
"
);
44
break
;
45
}
46
}
47
48
if
(i ==
user_num)
49
strcpy(buffer ,
"
0,login success
"
);
50
strcpy(users[user_num].name, message.choose.user.username);
51
strcpy(users[user_num++
].fifo, message.myfifo);
52
53
sendBuffer();
54
}
55
56
void
send(){
57
for
(i =
0
; i < user_num; ++
i)
58
{
59
if
(strcmp(message.choose.msg.name_dst, users[i].name) ==
0
)
60
break
;
61
}
62
if
(i ==
user_num)
63
strcpy(buffer,
"
the user is not exist! i=user_num
"
);
64
else
{
65
if
((fd = open(users[i].fifo, O_WRONLY | O_NONBLOCK)) == -
1
){
66
perror(
"
send-open
"
);
67
exit(
1
);
68
}
69
sprintf(buffer,
"
from %s: %s\n
"
, message.choose.msg.name_src,message.choose.msg.msg);
70
if
(write(fd, buffer, BUF_SIZE) == -
1
){
71
perror(
"
send-write
"
);
72
exit(
1
);
73
}
74
close(fd);
75
strcpy(buffer,
"
send success !!
"
);
76
}
77
sendBuffer();
78
}
79
80
void
operation(
int
type){
81
if
(type ==
LOGIN) login();
82
else
if
(type ==
SEND) send();
83
}
84
85
int
main(
int
argc,
char
const
*
argv[])
86
{
87
init();
88
while
(
1
){
89
if
((read(ser_fifo, &message,
sizeof
(Message) +
50
))>
0
){
90
operation(message.service_type);
91
}
92
}
93
return
0
;
94
}
client.c:
1
#include
"
head.h
"
2
#define
BUF_SIZE 100
3
char
mypipename[
100
];
4
char
myname[
50
];
5
char
buffer[BUF_SIZE];
6
int
ser_fifo;
7
int
my_fifo;
8
Message message;
9
10
11
void
init(){
12
if
(access(SERVER_FIFO, F_OK) == -
1
){
13
perror(
"
init-access
"
);
14
exit(
1
);
15
}
16
17
ser_fifo =
open(SERVER_FIFO, O_WRONLY);
18
if
(ser_fifo == -
1
){
19
perror(
"
init-open
"
);
20
exit(
1
);
21
}
22
23
sprintf(mypipename,
"
/tmp/client%d_fifo
"
, getpid());
24
//
printf("%s",mypipename);
25
if
(mkfifo(mypipename,
0777
) == -
1
){
26
perror(
"
init-mkfifo
"
);
27
exit(
1
);
28
}
29
30
my_fifo = open(mypipename, O_RDONLY |
O_NONBLOCK);
31
if
(my_fifo == -
1
){
32
perror(
"
open my fifo
"
);
33
exit(
1
);
34
}
35
36
strcpy(message.myfifo, mypipename);
37
}
38
39
void
sendMessage(){
40
if
(write(ser_fifo, &message,
sizeof
(Message)) == -
1
){
41
perror(
"
sendMessage-write
"
);
42
exit(
1
);
43
}
44
}
45
46
recMessage(){
47
int
res;
48
if
((res = read(my_fifo, buffer, BUF_SIZE)) == -
1
){
49
perror(
"
recMessage-read
"
);
50
exit(
1
);
51
}
52
return
res;
53
}
54
55
int
login(){
56
message.service_type =
LOGIN;
57
printf(
"
username:
"
);
58
scanf(
"
%s
"
, message.choose.user.username);
59
sendMessage();
60
while
(recMessage() ==
0
) ;
61
printf(
"
%s\n
"
, buffer);
62
if
(buffer[
0
] ==
'
0
'
){
63
strcpy(myname, message.choose.user.username);
64
return
0
;
65
}
66
return
-
1
;
67
}
68
69
void
send(){
70
message.service_type =
SEND;
71
printf(
"
message to :
"
);
72
scanf(
"
%s
"
, message.choose.msg.name_dst);
73
printf(
"
The message is :\n
"
);
74
getchar();
75
fgets(message.choose.msg.msg,
100
, stdin);
76
strcpy(message.choose.msg.name_src, myname);
77
sendMessage();
78
}
79
80
int
main(
int
argc,
char
const
*
argv[])
81
{
82
init();
83
while
(login()!=
0
);
84
int
pid;
85
if
((pid = fork()) == -
1
){
86
perror(
"
main-fork
"
);
87
exit(
1
);
88
}
89
90
if
(pid ==
0
){
91
while
(
1
){
92
if
(recMessage() >
0
)
93
printf(
"
%s\n
"
, buffer);
94
}
95
}
96
else
{
97
while
(
1
){
98
sleep(
1
);
99
send();
100
}
101
}
102
return
0
;
103
}
?
更多文章、技術交流、商務合作、聯系博主
微信掃碼或搜索:z360901061
微信掃一掃加我為好友
QQ號聯系: 360901061
您的支持是博主寫作最大的動力,如果您喜歡我的文章,感覺我的文章對您有幫助,請用微信掃描下面二維碼支持博主2元、5元、10元、20元等您想捐的金額吧,狠狠點擊下面給點支持吧,站長非常感激您!手機微信長按不能支付解決辦法:請將微信支付二維碼保存到相冊,切換到微信,然后點擊微信右上角掃一掃功能,選擇支付二維碼完成支付。
【本文對您有幫助就好】元

