首页 > C语言网络编程:close或者shutdown断开通信连接

C语言网络编程:close或者shutdown断开通信连接

文章目录

        • 前言
        • close函数介绍
        • shutdown函数介绍

前言

这里在主要通过实例进行描述close函数在网络编程中的使用

TCP编程模型中客户端或者服务器只要主动通过close发起断开连接的请求,则通信连接可以中断。

可以通过在主进程中抓取通信端的断开信号,比如SIGINT,在信号处理函数中对该通信文件描述符进行关闭。


close函数介绍

关于close断开连接的缺点:

  • 会一次性将读写文件描述符都关闭
  • 如果多个文件描述符指向同一个连接时(dup函数赋值的文件描述符/或者子进程继承了父进程的文件描述符),如果仅仅close其中一个文件描述符时,只要其他的fd还是打开状态,那么连接就不会断开,直到所有的文件描述符都被close之后

如下close相关代码

#include 
#include 
#include 
#include 
#include 
#include 
#include 
#include 
#include 
#include typedef struct data { char name[30];unsigned int num;
}Data;void print_err(char *str, int line, int err_no) { printf("%d, %s :%s
",line,str,strerror(err_no));_exit(-1);
}
int cfd = -1;//线程函数用于循环从cfd描述符中尝试接收数据
void *receive(void *pth_arg) { int ret = 0;Data stu_data = { 0};while(1) { //初始化结构体变量bzero(&stu_data, sizeof(stu_data));ret = recv(cfd, &stu_data, sizeof(stu_data),0);	if (-1 == ret) { print_err("recv failed",__LINE__,errno);}//接收之后需要将网络端序转换为主机端序printf("student number = %d student name = %s 
",ntohl(stu_data.num),stu_data.name);}
}/*信号处理函数,当发生SIGINT信号之后关闭通信的文件描述符,并返回成功*/
void sig_fun(int signo) { if (signo == SIGINT) { close(cfd);_exit(0);}
}int main()
{ int skfd = -1, ret = -1;skfd = socket(AF_INET, SOCK_STREAM, 0);if ( -1 == skfd) { print_err("socket failed",__LINE__,errno);}struct sockaddr_in addr;addr.sin_family = AF_INET; //设置tcp协议族addr.sin_port = 6789; //设置端口号addr.sin_addr.s_addr = inet_addr("192.168.102.169"); //设置ip地址ret = bind(skfd, (struct sockaddr*)&addr, sizeof(addr));if ( -1 == ret) { print_err("bind failed",__LINE__,errno);}/*将套接字文件描述符从主动转为被动文件描述符,然后用于被动监听客户端的连接*/ret = listen(skfd, 3);if ( -1 == ret ) { print_err("listen failed", __LINE__, errno);}/*被动监听客户端发起的tcp连接请求,三次握手后连接建立成功*/struct sockaddr_in caddr = { 0};int csize = 0;cfd = accept(skfd, (struct sockaddr*)&caddr, &csize);if (-1 == cfd) { print_err("accept failed", __LINE__, errno);}printf("cport = %d, caddr = %s
", ntohs(caddr.sin_port),inet_ntoa(caddr.sin_addr));//创建子线程用于接收数据pthread_t id;pthread_create(&id,NULL,receive,NULL);//创建信号处理函数signal(SIGINT,sig_fun);//发送数据结构体定义Data std_data = { 0};while (1) { printf("stu name:
");scanf("%s",std_data.name);printf("stu num:
");scanf("%d",&std_data.num);//对于int型的需要将主机端序转换为网络端序,这里转成long型。std_data.num = htonl(std_data.num);//将数据std_data强制类型转换后发送ret = send(cfd, (void *)&std_data,sizeof(std_data),0);if ( -1 == ret) { print_err("accept failed", __LINE__, errno);}	}return 0;
}

shutdown函数介绍

  • 头文件 #include
  • 函数使用:int shutdown(int sockfd, int how);
  • 功能:可以按照要求关闭连接,且不管有多个文件描述符指向同一个连接,只要调用shutdown去操作了其中某个描述符,连接就会被立即断开。
  • 返回值:成功:返回0,失败:返回-1
  • 参数:

    a. sockfd 通信文件描述符,服务器端表示accept函数返回的链接后通信描述符

    b. how 如何断开连接

    SHUT_RD 只断开读连接

    SHUT_WR只断开写连接

    SHUT_RDWR 读写连接都断开

由shutdown函数的描述中,我们很明显得能够看到shutdown相比于close函数的关闭连接的优势

更多相关:

  • 文章目录前言函数描述代码实例TCP服务器为什么调用listen 前言 根据TCP编程模型中我们可以看到之前的socket和bind接口是tcp服务器在为接收客户端的链接做准备,保证tcp的面向字节流,面向连接的可靠通信服务正常进行。接下来的listen端口则为我们进行三次握手与客户端进行链接的接口。 TCP编程模型如下...

  • 一.内存管理基本知识 1.S3C2440最多会用到两级页表:以段的方式进行转换时只用到一级页表,以页的方式进行转换时用到两级页表。页的大小有三种:大页(64KB),小页(4KB),极小页(1KB)。条目也称为"描述符",有:段描述符,大页描述符,小页描述符,极小页描述符——他们保存大页,小页,极小页的起始物理地址;粗页表描述符,细页表...

  • 文章目录搭建实验平台使用Unity的准备工作在PC端安装连接Hololens软件Hololens设置开始连接吧绘制显示PC端网页监控...

  •  将多次卷积和池化后的图像展开进行全连接,如下图所示。  全连接层需要把输入拉成一个列项向量          比如你的输入的feature map是2X2,那么就需要把这个feature map 拉成4X1的列向量,如果你的feature map 的channels是3,也就是你的输入是3X2X2,也就是相当于有了12个像素点,...

  •   注意,前情提示: 本代码基于《Node.js(nodejs)对本地JSON文件进行增、删、改、查操作(轻车熟路)》 传送门Node.js(nodejs)对本地JSON文件进行增、删、改、查操作(轻车熟路)_你挚爱的强哥❤给你发来1条消息❤-CSDN博客 首先安装 cnpm i nodejs-websocket 在/a...

  • Ubuntu 配置自带桌面共享 1、在setting>>shareing>>remote 选择on 如果用ubunutu直接远程连接的话已经可以了, 2、在ubuntu下使用系统自带的remmina连接 vnc类型 直接输入ip地址 3、如果在windows下面连接的话需要把加密选项关闭 内容: 安装dconf-edito...

  • 第四节 RabbitMQ在C#端的应用-客户端连接 原文:第四节 RabbitMQ在C#端的应用-客户端连接 版权声明:未经本人同意,不得转载该文章,谢谢 https://blog.csdn.net/phocus1/article/details/87357911 1.在VS2013中新建控制台程序,然后添加引用:.NE...

  • 草色新雨中, 松声晚窗里。之前我们学习 Power Query 都是用鼠标就完成了很多复杂的操作。虽然 PowerQuery 已经将大部分常用功能内置成到功能区。基本能完成我们大部分的报表自动化功能。但是总有些复杂的或者个性化的问题是开发团队没有预先想到的,这时我们就需要学习 M 语言。一、M 语言在哪里?M语言的函数公式有三个地...

  • 前言从2020年3月份开始,计划写一系列文档--《小白从零开始学编程》,记录自己从0开始学习的一些东西。第一个系列:python,计划从安装、环境搭建、基本语法、到利用Django和Flask两个当前最热的web框架完成一个小的项目第二个系列:可能会选择Go语言,也可能会选择Vue.js。具体情况待定,拭目以待吧。。。基本概念表达式表...

  • 1.1函数1.1.1什么是函数函数就是程序实现模块化的基本单元,一般实现某一功能的集合。函数名:就相当于是程序代码集合的名称参数:就是函数运算时需要参与运算的值被称作为参数函数体:程序的某个功能,进行一系列的逻辑运算return 返回值:函数的返回值能表示函数的运行结果或运行状态。1.1.2函数的作用函数是组织好的,可重复使用的,用来...

  • 原标题:基于Python建立深度神经网络!你学会了嘛?图1 神经网络构造的例子(符号说明:上标[l]表示与第l层;上标(i)表示第i个例子;下标i表示矢量第i项)单层神经网络图2 单层神经网络示例神经元模型是先计算一个线性函数(z=Wx+b),接着再计算一个激活函数。一般来说,神经元模型的输出值是a=g(Wx+b),其中g是激活函数(...

  • 在学习MySQL的时候你会发现,它有非常多的函数,在学习的时候没有侧重。小编刚开始学习的时候也会有这个感觉。不过,经过一段时间的学习之后,小编发现尽管函数有很多,但是常用的却只有那几个。今天小编就把常用的函数汇总一下,为大家能够能好的学习MySQL中的函数。MySQL常使用的函数大概有四类。时间函数、数学函数、字符函数、控制函数。让我...