linux c++ tcosocket 解决客户端退出,服务器自动退出问题

在Ubuntu 16.04上,当TCP套接字用于数据传输时,若客户端退出,服务器会无错误地随之退出。原因是客户端断开连接时触发了SIGPIPE信号。解决方案是在服务器的recv()函数返回值小于0时,屏蔽该信号,以防止服务器进程结束。通过修改服务器代码,在异常返回时处理信号屏蔽,可以避免服务器因客户端中断而退出。
摘要由CSDN通过智能技术生成

前言:

UBUNTU16.04下,实现一个tcp套接字接传数据,存在一个问题,客户端一旦退出连接,服务器自动无错退出,解决方法如下

原因:

客户端发送数据采用的send,服务器会断开主要是 客户端断开后产生了 SIGPIPE信号   在对的位置忽略掉该信号就可以了!主要是服务器会recv接受客户端发送过来的数据,因此当没有接受导数据时,recv()函数返回值<=0,此时,服务器会接收到终端信号,结束进程。

解决方法:

在recv()函数返回值<0的情况下家还是那个信号屏蔽即可

#include<signal.h>


signal(SIGPIPE, SIG_IGN);

示例:

server.cpp

#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#include<errno.h>
#include<sys/types.h>
#include<sys/socket.h>
#include<netinet/in.h>
#include<unistd.h>
#include<iostream>
#include<signal.h>
using namespace std;

#define SERV_PORT_TCP       8000  //tcp连接端口号

void tcp_transport_msg()
{
	cout<<"tcp tcp start"<<endl;
	int  listenfd, connfd;  //监听和连接号
    struct sockaddr_in  servaddr;  //服务器网络地址结构体
    // char recv_buff[MAXLINE];   //接受缓冲区
    //传感器数据和寻源结束后位置数据以及接受控制标志位数据
	int send_num1, send_num2, recv_num;  
	//接受控制台传过来的寻源控制标志位
	unsigned char recv_buf1[8];
	int a = 0; 

	//创建服务器端套接字
    if( (listenfd = socket(AF_INET, SOCK_STREAM, 0)) == -1 )
	{
        printf("create socket error: %s(errno: %d)\n",strerror(errno),errno);
    }
	
    memset(&servaddr, 0, sizeof(servaddr));  //数据初始化清零
    servaddr.sin_family = AF_INET;   //设置ip通信
    servaddr.sin_addr.s_addr = htonl(INADDR_ANY);   //服务器ip地址,允许连接到所有本地地址上
    servaddr.sin_port = htons(SERV_PORT_TCP);   //端口号
	
	//将套接字绑定到服务器网络地址上
    if( bind(listenfd, (struct sockaddr*)&servaddr, sizeof(servaddr)) == -1)
	{
        printf("bind socket error: %s(errno: %d)\n",strerror(errno),errno);
    }	

	//监听连接请求
    if( listen(listenfd, 10) == -1){
        printf("listen socket error: %s(errno: %d)\n",strerror(errno),errno);
    }
	

	mutex1.lock();
    cout<<"======waiting for client's request======"<<endl;
	mutex1.unlock();

	while(1)
	{
		
		
 
		//等待客户端连接请求到达
		connfd = accept(listenfd, (st
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值