socket编程常见操作
1、连接的建立
分为两种:服务端处理接收客户端的连接;服务端作为客户端连接第三方服务
//作为服务端 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可以指定关闭某一条通道
// 主动关闭 close(fd); shutdown(fd, SHUT_RDWR); // 主动关闭本地读端,对端写端关闭 shutdown(fd, SHUT_RD); // 主动关闭本地写端,对端读端关闭 shutdown(fd, SHUT_WR);
被动关闭:一端主动关闭后,另一端的被动处理;可以区分到底是读端关闭了还是写端关闭了,以实现半关闭状态
// 被动:读端关闭
// 有的网络编程需要支持半关闭状态
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、消息的到达
从读缓冲区中读取数据
int n = read(fd, buf, sz); if (n4、消息发送完毕
往写缓冲区写数据
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)对应的管道被关闭,或者在非阻塞模式下写入的目标已经没有足够的空间来接收数据
免责声明:我们致力于保护作者版权,注重分享,被刊用文章因无法核实真实出处,未能及时与作者取得联系,或有版权异议的,请联系管理员,我们会立即处理! 部分文章是来自自研大数据AI进行生成,内容摘自(百度百科,百度知道,头条百科,中国民法典,刑法,牛津词典,新华词典,汉语词典,国家院校,科普平台)等数据,内容仅供学习参考,不准确地方联系删除处理! 图片声明:本站部分配图来自人工智能系统AI生成,觅知网授权图片,PxHere摄影无版权图库和百度,360,搜狗等多加搜索引擎自动关键词搜索配图,如有侵权的图片,请第一时间联系我们,邮箱:ciyunidc@ciyunshuju.com。本站只作为美观性配图使用,无任何非法侵犯第三方意图,一切解释权归图片著作权方,本站不承担任何责任。如有恶意碰瓷者,必当奉陪到底严惩不贷!

