UDP进程通信试验

UDP进程通信试验

实验内容:

实现两个进程间通讯,模拟照明控制功能。一个进程模拟客户端,另一个进程模拟服务端。客户端发出控制命令,服务端执行控制命令。客户端发出的控制命令包括:open,close,quit。分别代表打开灯、关闭灯、退出程序。服务端接收到打开灯指令,发出两声系统音,关闭灯指令发出一声系统音。退出指令两个进程都退出。
不限定采用何种通讯方式。
采用makefile编译整个项目。

//服务端
#include <sys/types.h>
#include <sys/socket.h>
#include <string.h>
#include <netinet/in.h>
#include <stdio.h>
#include <stdlib.h>
#define MAXLINE 80
#define SERV_PORT 8888
void do_echo(int sockfd, struct sockaddr *pcliaddr, socklen_t clilen){
int n;
char open[MAXLINE]="open\n"; char close[MAXLINE]="close\n"; char quit[MAXLINE]="quit\n"; socklen_t len;
char mesg[MAXLINE];
for(;;){
len = clilen;
memset(mesg,0,MAXLINE);
n = recvfrom(sockfd, mesg, MAXLINE, 0, pcliaddr, &len); /* 等待接收数据 */ if(strcmp(mesg,open)==0){
printf("\a\a");//两声
sendto(sockfd, "Light On\n", 9, 0, pcliaddr, len); /* 将接收到的数据发送回
去 */
}else if(strcmp(mesg,close)==0){
printf("\a");//一声
sendto(sockfd, "Light Off\n", 10, 0, pcliaddr, len); /* 将接收到的数据发送 回去 */
}else if(strcmp(mesg,quit)==0){
sendto(sockfd, "Process Shutdown\n", 17, 0, pcliaddr, len); /* 将接收到的
数据发送回去 */
fputs("Process Shutdown\n", stdout); exit(1);
}
fputs(mesg, stdout); }
}
int main(void) {
int sockfd;
struct sockaddr_in servaddr, cliaddr;
sockfd = socket(AF_INET, SOCK_DGRAM, 0);
bzero(&servaddr, sizeof(servaddr));
servaddr.sin_family = AF_INET; servaddr.sin_addr.s_addr=htonl(INADDR_ANY);/*定义为 INADDR_ANY*/ servaddr.sin_port = htons(SERV_PORT);
if(bind(sockfd, (struct sockaddr *)&servaddr, sizeof(servaddr)) == -1){/* 绑定
IP 地址和端口*/ perror("bind error"); exit(1);
}
do_echo(sockfd, (struct sockaddr *)&cliaddr, sizeof(cliaddr)); return 0;
} //客户端
#include <sys/types.h> #include <sys/socket.h> #include <string.h> #include <netinet/in.h> #include <stdio.h> #include <stdlib.h> #include <arpa/inet.h>
/* 创建 socket */ /* 初始化 servaddr */
#include <unistd.h>
#define MAXLINE 80
#define SERV_PORT 8888
void do_cli(FILE *fp, int sockfd, struct sockaddr *pservaddr, socklen_t servlen){
int n;
char open[MAXLINE]="open\n";
char close[MAXLINE]="close\n";
char quit[MAXLINE]="quit\n";
char sendline[MAXLINE], recvline[MAXLINE + 1];
if(connect(sockfd, (struct sockaddr *)pservaddr, servlen) == -
1){
/* 连接服务器 */
perror("connect error");
exit(1); }
while(fgets(sendline, MAXLINE, fp) != NULL){ memset(recvline,0,MAXLINE);
if(strcmp(sendline,open)==0||strcmp(sendline,close)==0||strcmp(sendline,quit)== 0){/*仅识别open,close,quit 三个命令*/
write(sockfd, sendline, strlen(sendline));/*读一行并发送到服务器*/
n = read(sockfd, recvline, MAXLINE); /* 接收从服务器来的数据 */ if(n == -1){
perror("read error");
exit(1); }
if(strcmp(recvline,"Process Shutdown\n")==0){ fputs(recvline, stdout);
exit(1);
}
fputs(recvline, stdout); }else{
printf("请输入正确命令\n【open】【close】【quit】\n"); }
} }
int main(int argc, char **argv) {
int sockfd;
struct sockaddr_in servaddr; if(argc != 2){ /* 输入参数检查 */
printf("usage: udpclient <IPaddress>\n");
exit(1); }
bzero(&servaddr, sizeof(servaddr)); /*初始化 servaddr */ servaddr.sin_family = AF_INET;
servaddr.sin_port = htons(SERV_PORT); if(inet_pton(AF_INET, argv[1], &servaddr.sin_addr) <= 0){
printf("[%s] is not a valid IPaddress\n", argv[1]);
exit(1); }
sockfd = socket(AF_INET, SOCK_DGRAM, 0);
do_cli(stdin, sockfd, (struct sockaddr *)&servaddr, sizeof(servaddr)); return 0;
}

makefile

.SUFFIXES:.c .o
CC=gcc

SRCS = $(wildcard *.c)
OBJS=$(SRCS:.c=.o)
all: $(SRCS)
    $(CC) -o server server.c
    $(CC) -o client client.c
.c.o:   
    $(CC) -Wall -o $@ -c $<
clean:
    rm -rf $(OBJS)

这里写图片描述

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值