前言:
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