错误的出现
当服务器出现关闭的时候,通过命令我发现客户端链接并没有断,这样客户端发进行发送消息的动作,但是根本不知道服务器已经挂啦,所以会出现服务器还存在的假象,所以我就查看了一下客户端的代码发现是没有用相同的信号进行父子进程还有收到数据的判断作为依据进行正常关闭,和服务器一样,只需要用一些简单的检测就好。
解决方案代码
#include<unistd.h>
#include<sys/stat.h>
#include<sys/wait.h>
#include<sys/types.h>
#include<fcntl.h>
#include<stdlib.h>
#include<stdio.h>
#include<errno.h>
#include<string.h>
#include<signal.h>
#include<arpa/inet.h>
#include<sys/socket.h>
#include<netinet/in.h>
#include<arpa/inet.h>
void handle(int number)
{
printf("recv num:%d\n",number);
}
int main()
{
int sockfd = 0;
//信号操作
signal(SIGUSR1,handle);
sockfd = socket(PF_INET,SOCK_STREAM,0);
if(sockfd == -1)
{
perror("socket fun is error\n");
exit(0);
}
struct sockaddr_in srvaddr;
srvaddr.sin_family = AF_INET;
srvaddr.sin_port = htons(8001);
srvaddr.sin_addr.s_addr = inet_addr("127.0.0.1");
if(connect(sockfd,(struct sockaddr*)(&srvaddr),sizeof(srvaddr))<0)
{
perror("connect is error\n");
exit(0);
}
int pid = fork();
if(pid>0)
{
//父进程操作
char sendbuf[1024] = {0};
while(fgets(sendbuf,sizeof(sendbuf),stdin)!=NULL)
{
write(sockfd,sendbuf,strlen(sendbuf));
memset(sendbuf,0,sizeof(sendbuf));
}
}
else
{
char revbuf[1024]={0};
while(1)
{
//新增加的内容
int ret = 0;
ret = read(sockfd,revbuf,sizeof(revbuf));
if(ret <0)
{
printf("read data is error\n");
break;
}
if(ret == 0)
{
printf("服务器已经挂掉\n");
break;
}
fputs(revbuf,stdout);
memset(revbuf,0,sizeof(revbuf));
}
close(sockfd);
kill(getppid(),SIGUSR1);
exit(0);
}
close(sockfd);
return 0;
}
其中一个小插曲就是忘记了一个break,结果哪是悲剧啊,希望写服务器的朋友要引以为戒哈哈