先放下代碼? 回來在解釋
頭文件:
clientinfo.h
1
struct
CLIENTINFO{
2
char
myfifo[
500
];
3
int
leftarg;
4
int
rightarg;
5
char
op;
6
};
7
typedef
struct
CLIENTINFO CLIENTINFO, *CLINTINFOPTR;
client.c
1
#include <unistd.h>
2
#include <stdio.h>
3
#include <stdlib.h>
4
#include <
string
.h>
5
#include <sys/types.h>
6
#include <fcntl.h>
7
#include <signal.h>
8
#include
"
clientinfo.h
"
9
10
#define
FIFO_NAME "/home/levi/chatapplication/data/server_fifo/chat_server_fifo"
11
#define
BUFF_SZ 100
12
13
char
mypipename[BUFF_SZ];
14
void
handler(
int
sig){
15
unlink(mypipename);
16
exit(
1
);
17
}
18
19
int
main(
int
argc,
char
const
*
argv[])
20
{
21
int
res;
22
int
fifo_fd, my_fifo;
23
int
fd;
24
CLIENTINFO info;
25
char
buffer[BUFF_SZ];
26
27
signal(SIGKILL, handler);
28
signal(SIGINT, handler);
29
signal(SIGTERM, handler);
30
31
if
(argc !=
4
){
32
printf(
"
Usage: %s op1 operation op2\n
"
, argv[
0
]);
33
exit(
1
);
34
}
35
if
(access(FIFO_NAME, F_OK) == -
1
){
36
printf(
"
Could not open FIFO %s\n
"
, FIFO_NAME);
37
exit(EXIT_FAILURE);
38
}
39
fifo_fd =
open(FIFO_NAME, O_WRONLY);
40
if
(fifo_fd == -
1
){
41
printf(
"
Could not open %s for write access\n
"
, FIFO_NAME);
42
exit(EXIT_FAILURE);
43
}
44
sprintf(mypipename,
"
/home/levi/chat_client_%d_fifo
"
, getpid());
45
res = mkfifo(mypipename,
0777
);
46
if
(res !=
0
){
47
printf(
"
FIFO %s was not created\n
"
, buffer);
48
exit(EXIT_FAILURE);
49
}
50
51
my_fifo = open(mypipename, O_RDONLY |
O_NONBLOCK);
52
if
(my_fifo == -
1
){
53
printf(
"
Could not open %s for read only access\n
"
, FIFO_NAME);
54
exit(EXIT_FAILURE);
55
}
56
57
strcpy(info.myfifo, mypipename);
58
info.leftarg = atoi(argv[
1
]);
59
info.op = argv[
2
][
0
];
60
info.rightarg = atoi(argv[
3
]);
61
62
write(fifo_fd, &info,
sizeof
(CLIENTINFO));
63
close(fifo_fd);
64
65
memset(buffer,
'
\0
'
, BUFF_SZ);
66
while
(
1
){
67
res =
read(my_fifo, buffer, BUFF_SZ);
68
if
(res >
0
){
69
printf(
"
Received from server : %s\n
"
, buffer);
70
break
;
71
}
72
}
73
printf(
"
Client %d is terminating\n
"
, getpid());
74
close(my_fifo);
75
(
void
)unlink(mypipename);
76
return
0
;
77
}
?
server.c
1
#include <unistd.h>
2
#include <stdio.h>
3
#include <stdlib.h>
4
#include <
string
.h>
5
#include <sys/types.h>
6
#include <fcntl.h>
7
#include <signal.h>
8
#include
"
clientinfo.h
"
9
10
#define
FIFO_NAME "/home/levi/server_fifo/chat_server_fifo"
11
void
handler(
int
sig){
12
unlink(FIFO_NAME);
13
exit(
1
);
14
}
15
16
int
calc(CLIENTINFOPTR info){
17
switch
(info->
op){
18
case
'
+
'
:
return
info->leftarg + info->
rightarg;
19
case
'
-
'
:
return
info->leftarg - info->
rightarg;
20
case
'
*
'
:
return
info->leftarg * info->
rightarg;
21
case
'
/
'
:
return
info->leftarg / info->
rightarg;
22
}
23
return
0
;
24
}
25
26
int
main(
int
argc,
char
const
*
argv[])
27
{
28
int
res, i, fifo_fd, fd1;
29
CLIENTINFO info;
30
char
buffer[
100
];
31
signal(SIGKILL, handler);
32
signal(SIGINT, handler);
33
signal(SIGTERM, handler);
34
if
(access(FIFO_NAME, F_OK) == -
1
){
35
res = mkfifo(FIFO_NAME,
0777
);
36
if
(res !=
0
){
37
printf(
"
FIFO %s was not created\n
"
, FIFO_NAME);
38
exit(EXIT_FAILURE);
39
}
40
}
41
fifo_fd =
open(FIFO_NAME, O_RDONLY);
42
if
(fifo_fd == -
1
){
43
printf(
"
Could not open %s for read only access\n
"
, FIFO_NAME);
44
exit(EXIT_FAILURE);
45
}
46
printf(
"
\nServer is rarin to go !\n
"
);
47
while
(
1
){
48
res = read(fifo_fd, &info,
sizeof
(CLIENTINFO));
49
if
(res !=
0
){
50
printf(
"
Client arrived!!\n
"
);
51
sprintf(buffer,
"
The result is %d
"
, calc(&
info));
52
fd1 = open(info.myfifo, O_WRONLY |
O_NONBLOCK);
53
write (fd1, buffer, strlen(buffer) +
1
);
54
close(fd1);
55
}
56
57
}
58
return
0
;
59
}
OK!
./server.c &
./client 3 + 5
看輸出吧!
?
?
更多文章、技術交流、商務合作、聯系博主
微信掃碼或搜索:z360901061
微信掃一掃加我為好友
QQ號聯系: 360901061
您的支持是博主寫作最大的動力,如果您喜歡我的文章,感覺我的文章對您有幫助,請用微信掃描下面二維碼支持博主2元、5元、10元、20元等您想捐的金額吧,狠狠點擊下面給點支持吧,站長非常感激您!手機微信長按不能支付解決辦法:請將微信支付二維碼保存到相冊,切換到微信,然后點擊微信右上角掃一掃功能,選擇支付二維碼完成支付。
【本文對您有幫助就好】元

