半关闭
主动方关闭应用层的写端,无法在应用层发送数据;但是主动方在应用层仍可接收对方发来的数据,此时主动方为半关闭状态。
半关闭函数
#include<sys/socket.h>
int shutdown(int sockfd, int how);
/*
功能:
关闭socket的写端或者读端。
参数:
sockfd:要操作的套接字文件描述符
how:关闭方式
SHUT_RD:关闭sockfd的读端,将无法读sockfd上的数据。任何在套接字读缓冲区的数据将被丢弃。
SHUT_WR:关闭sockfd的写端,将无法往sockfd上写数据。
SHUTRDWR:关闭sockfd的读写端。
返回值:
成功:0
失败:-1,并设置errno。
*/
心跳包
用于维持连接或测试连接是否崩溃、断开。
如长时间处于空闲状态的连接,发送心跳包可使连接保持活跃,避免空闲时间过长导致连接中断。
心跳包通常是由客户端发给服务器。客户端通过定时给服务器发送心跳包表示自己还活着。若服务器在一定时间内未收到客户端的心跳包,则认为客户端已断开,就需要进行资源回收等处理。
设置心跳包函数
直接使用如下函数即可。
keepAlive = 1;
setsockopt(sockfd, SOL_SOCKET, SO_KEEPALIVE, (void*)&keepAlive, sizeof(keepAlive));
/*
参数:
sockfd:socket函数返回的文件描述符。
SO_KEEPALIVE:设置保持连接选项。即心跳包。
其余参数可以直接按上述填写。
*/
端口复用
端口重新使用。
如进程A正在使用端口8888;此时进程B设置了端口复用,也使用端口8888,则进程A将无法再使用端口8888。
如何设置端口复用?
在服务器端代码的socket函数和bind函数间插入如下代码即可:
int opt = 1;
setsockopt(sockfd, SOL_SOCKET, SO_REUSEADDR, &opt, sizeof(opt));
/*
参数:
sockfd:socket函数返回的文件描述符。
SO_REUSEADDR:设置端口复用选项。
其余参数可以直接按上述填写。
*/