日期:2014-05-16  浏览次数:20701 次

linux下关于服务端断开后客户端自动退出的问题

问题描述:谢了一个客户端和服务端,正常运行后,客户端不断向服务端发送消息,当服务端跟客户端断开连接或者把服务端关闭后,客户端会再发送一次消息后自动退出。而有些情况我们不希望这种情况发生。

原因分析:简单的说就是服务端关闭后,客户端给服务端发送了一条信息,服务端已经关闭,则客户端收到信息,产生SIGPIPE信号,这个信号告诉进程关闭,我们要做的就是捕获这个信号让它按自己的意愿进行

解决方法:

1.signal(SIGPIPE, SIG_IGN):忽略sigpipe信号

2.signal(SIGPIPE, 自己定义的函数名):捕获该信号后可以执行自己定义的函数。下面的例子即采用此方法:

 

 

//client.c

 

#include <stdlib.h>
#include <sys/types.h>
#include <stdio.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <string.h>
#include <arpa/inet.h>
#include <signal.h>
void signalset()
{printf("signal get\n");getchar();}
int main()
{
int sfp,nfp;
struct sockaddr_in s_add,c_add;
int sin_size;
unsigned short portnum=0x8888;
char buf[1024]="hello server!";

printf("Hello,welcome to my server !\r\n");
sfp = socket(AF_INET, SOCK_STREAM, 0);
if(-1 == sfp)
{
    printf("socket fail ! \r\n");
    return -1;
}
printf("socket ok !\r\n");


bzero(&s_add,sizeof(struct sockaddr_in));
s_add.sin_family=AF_INET;
s_add.sin_addr.s_addr=htonl(INADDR_ANY);
s_add.sin_port=htons(portnum);

if(-1 == connect(sfp,(struct sockaddr *)(&s_add), sizeof(struct sockaddr)))
{
    printf("bind fail !\r\n");
    return -1;
}
printf("connect ok !\r\n");


        signal(SIGPIPE,signalset);
while(1)
{
                                sleep(2);
                                if(!send(sfp,buf,sizeof(buf),0)>0)
                                {
                                printf("write fail!\r\n");
                                }
                                recv(sfp,buf,1024,0);
                                printf("send:%s\n",buf);

}
close(sfp);
return 0;
}

 

//server.c

#include <stdlib.h>
#include <sys/types.h>
#include <stdio.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <string.h>
#include <arpa/inet.h>

int main()
{
int sfp,nfp;
struct sockaddr_in s_add,c_add;

int sin_size;
unsigned short portnum=0x8888;
char buf[1024];
printf("Hello,welcome to my server !\r\n");
sfp = socket(AF_INET, SOCK_STREAM, 0);

if(-1 == sfp)
{
    printf("socket fail ! \r\n");^M