socket编程常见操作

1、连接的建立

分为两种:服务端处理接收客户端的连接;服务端作为客户端连接第三方服务

cpp 复制代码
//作为服务端
int listenfd = socket(AF_INET, SOCK_STREAM, 0);
bind(listenfd, (struct sockaddr*)&servaddr, sizeof(servaddr)))
listen(listenfd, 10); //listen(fd, backlog)
int clientfd = accept(listenfd, addr, sz);

//作为客户端
// 举例为非阻塞io,阻塞io成功直接返回0;
int connectfd = socket(AF_INET, SOCK_STREAM, 0);
int ret = connect(connectfd, (struct sockaddr*)&addr, sizeof(addr));
// ret == -1 && errno == EINPROGRESS 正在建立连接
// ret == -1 && errno = EISCONN 连接建立成功

TCP在listen时的参数backlog的意义

backlog 表示accept全连接队列的大小,也就是三次握手完成后,server没有调用accept从 全连接队列 取出连接时,连接队列中最大可存放的数量

2、连接的断开

主动断开:由于tcp是全双工的,连接包含两条通道,client的R端 server的W端,client的W端 server的R端。client和server都可以主动关闭两条通道的任意一条。close 会同时关闭R端和W端,shutdown可以指定关闭某一条通道

cpp 复制代码
// 主动关闭
close(fd);
shutdown(fd, SHUT_RDWR);
// 主动关闭本地读端,对端写端关闭
shutdown(fd, SHUT_RD);
// 主动关闭本地写端,对端读端关闭
shutdown(fd, SHUT_WR);

被动关闭:一端主动关闭后,另一端的被动处理;可以区分到底是读端关闭了还是写端关闭了,以实现半关闭状态

cpp 复制代码
// 被动:读端关闭
// 有的网络编程需要支持半关闭状态
int n = read(fd, buf, sz);
if (n == 0) {    
    close_read(fd);    
    // write()   //只是读端关闭了,还可以将未发送完成的数据继续发送完成 
    // close(fd);
}
// 被动:写端关闭
int n = write(fd, buf, sz);
if (n == -1 && errno == EPIPE) {    
    close_write(fd);    
    // close(fd);
}

EPIPE 错误表示在进行写入操作时,写入的目标文件描述符(或socket)对应的管道被关闭,或者在非阻塞模式下写入的目标已经没有足够的空间来接收数据

3、消息的到达

从读缓冲区中读取数据

cpp 复制代码
int n = read(fd, buf, sz);
if (n < 0) { // n == -1
    if (errno == EINTR || errno == EWOULDBLOCK)
        break;
    close(fd);
} else if (n == 0) {
    close(fd);
} else {
    // 处理 buf
}

4、消息发送完毕

往写缓冲区写数据

cpp 复制代码
int n = write(fd, buf, dz);
if (n == -1) {
    if (errno == EINTR || errno == EWOULDBLOCK) {
        return;
   }
   if (errno == EPIPE) {       
    // close(fd);
    }
    close(fd);
}
  • EINTR表示系统调用被信号中断,在Linux系统中,一些系统调用可以被信号中断,而中断发生时,系统调用通常会返回EINTR错误码。这是系统为了避免进程在等待系统调用时被无限暂停,而中断休眠过程的一种防护机制。通常情况下,EINTR错误不属于真正意义上的错误,而是一种稍后可以重试的提示
  • EWOULDBLOCK 表示写缓冲区已满
  • EPIPE 错误表示在进行写入操作时,写入的目标文件描述符(或socket)对应的管道被关闭,或者在非阻塞模式下写入的目标已经没有足够的空间来接收数据
相关推荐
李永奉2 分钟前
中科蓝讯SDK开发-BT897X、BT891X、AB573X、AB572X 系列 触摸按键提示音功能实现
网络·单片机·嵌入式硬件·mcu·物联网
ShineWinsu3 分钟前
对于ProtoBuffer:ProtoBuffer的介绍以及安装
linux·网络·google·协议·序列化·反序列化·protobuffer
Eddyp30 分钟前
避开溢价!艾默生 TREX2 手操器省钱选型攻略
网络·其他·百度·微信·微信公众平台·新浪微博
FlightYe32 分钟前
视界原理之2D视频(二):视频文件里有什么
android·linux·网络·c++·ffmpeg·音视频·aac
2601_967212722 小时前
国际品质电源轨道系统供应商技术评估维度
大数据·网络·经验分享
GeW2 小时前
从代码到共识:技术突围如何映照大国相处之道
linux
acrel73 小时前
化工企业能源管理体系下智能化技术实践与探索
网络·人工智能
承渊政道3 小时前
Linux系统学习【进程信号详细解析——认识、产生、保存以及捕捉信号】
linux·学习·ubuntu·ssh·vs code·进程信号
尹人入圣3 小时前
市面上靠谱的IP驱动产业新场景新工具哪个好
网络·python·网络协议·tcp/ip
硅基手札3 小时前
【linux内核专栏01】Linux 内核心智模型与设计哲学
linux·运维·驱动开发·开源软件