简介

服务器调用accept与客户端建立连接,连接建立成功后,会返回一个fd,表示这条了连接的文件描述符。之后调用recv函数接受连接的信息。根据recv函数的原型,需要服务器程序有一个接收缓冲区,实际情况可能缓冲区长度不够,需要多次接收。这时候需要调用while循环接收。

如果连接建立成功,而且有数据发过来,但是此时的服务器没有及时处理,那么消息会放到缓冲区中,直到使用recv函数接收。也就是说,接收数据由内核完成并放到有关的缓冲区当中,recv的接收实际上是从内核中进行读取。下面的20秒就是模拟这个过程。

代码实例

非阻塞方式,一次性接受完成后就退出

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <sys/socket.h>
#include <sys/types.h>
#include <thread>
#include <chrono>
#include <netinet/ip.h>
#include <iostream>int main() {int ret, listenfd;struct sockaddr_in serv_addr;bzero(&serv_addr, sizeof(serv_addr));serv_addr.sin_family = AF_INET;  serv_addr.sin_port = htons(8001);serv_addr.sin_addr.s_addr = htonl(INADDR_ANY);listenfd = socket(AF_INET, SOCK_STREAM, 0);if (listenfd < 0) {perror("socket() error\n");return 0;}ret = bind(listenfd, (struct sockaddr*)&serv_addr, sizeof(serv_addr));if (ret < 0) {perror("bind() error\n");return 0;}ret = listen(listenfd, 1000);if (ret < 0) {perror("listen() error\n");return 0;}int connfd = accept(listenfd, NULL, NULL);if (connfd < 0) {perror("accept() error\n");return 0;}std::cout << "sleep for 20 seconds...\n";std::this_thread::sleep_for(std::chrono::seconds(20));std::cout << "weak up\n";char buf[100];memset(buf, 0, 100);// 这里是非阻塞,如果是阻塞方式,把MAG_DONTWAIT改成0即可while (recv(connfd, buf, sizeof(buf), MSG_DONTWAIT) > 0) {std::cout << "\nreceive message: " << buf;memset(buf, 0, sizeof(buf));}return 0;
}

Linux下TCP循环接收数据的方式相关推荐

  1. Linux下往移动硬盘拷贝数据步骤方式

    ①, 使用 df -h  和 fdisk -l 查看确认移动硬盘信息  : fdisk –l 或 more /proc/partitions #查看系统的硬盘和硬盘分区情况. ②,使用 parted ...

  2. linux下TCP通信简单实例

    linux下TCP通信简单实例 基于TCP(面向连接)的socket编程,分为服务器端和客户端 服务器端的流程如下: (1)创建套接字(socket) (2)将套接字绑定到一个本地地址和端口上(bin ...

  3. 监视和调整Linux网络协议栈:接收数据

    Table of Contents 有关监视和调整Linux网络协议栈的建议 总览 详细外观 网络设备驱动程序 初始化 网络设备初始化 启动网络设备 监控网络设备 调整网络设备 SoftIRQ 什么是 ...

  4. Linux下Rsync+Inotify-tools实现数据实时同步

    说明: 操作系统:CentOS 5.X 源服务器:192.168.21.129 目标服务器:192.168.21.127,192.168.21.128 目的:把源服务器上/home/www.osyun ...

  5. Linux下Rsync+sersync实现数据实时同步

    一.为什么要用Rsync+sersync架构? 1.sersync是基于Inotify开发的,类似于Inotify-tools的工具 2.sersync可以记录下被监听目录中发生变化的(包括增加.删除 ...

  6. linux mysql 数据文件,Linux下修改MySQL数据库数据文件路径的步骤

    使用rpm安装方式安装完MySQL数据库后,数据文件的默认路径为/var/lib/mysql,然而根目录并不适合用于存储数据文件. 原路径:/var/lib/mysql 目标路径:/home/mysq ...

  7. linux中mongo的导出数据,Linux下mongodb安装及数据导入导出教程(示例代码)

    Linux下mongodb安装及数据导入导出教程 #查看linux发行版本 cat /etc/issue #查看linux内核版本号 uname -r 一.Linux下mongodb安装的一般步骤 1 ...

  8. LINUX 下tcp 和 udp 套接字收发缓冲区的大小决定规则 .

    const int udp_recvbufsize = 384 * 1024 ; int result = ::setsockopt(m_hSocket, SOL_SOCKET, SO_RCVBUF, ...

  9. Linux下mongodb安装及数据导入导出教程

    Linux下mongodb安装及数据导入导出教程 #查看linux发行版本 cat /etc/issue #查看linux内核版本号 uname -r 一.Linux下mongodb安装的一般步骤 1 ...

最新文章

  1. AI研习丨专题:因果推断与因果性学习研究进展
  2. 为什么重启路由器 经常重启让WiFi更快
  3. Esper 20章 优化
  4. 和FBI杠上了 苹果聘前亚马逊信息安全副总裁
  5. 基于PredictionIO的推荐引擎打造,及大规模多标签分类探索
  6. Java举例include_Java StringUtils.getFilenameExtension方法代码示例
  7. 项目管理系列之质量管理
  8. Java设计模式12:装饰器模式
  9. pgpool-II 高可用搭建
  10. Akka-CQRS(2)- 安装部署cassandra cluster,ubuntu-16.04.1-LTS and MacOS mojave
  11. C++之sizeof(vector)
  12. 如何使用 Numbers 筛选出特定种类的资料?
  13. 从Java程序员到架构师,从工程师到技术专家,迷茫之路
  14. SpringDataJPA之Specification复杂查询
  15. robotframework调用python类方法_【RF基础】RF调用Python函数基础
  16. 知网等数据库文献快速直接导入EndNote的方法
  17. Android Studio入门(安装--开发调试)
  18. Python matplotlib数据可视化 subplot绘制多个子图
  19. 南阳市新野县计算机技术学校,新野县中等职业学校学校概况
  20. 3个窗口卖票java_三个窗口同时卖火车票,如何用代码将该场景实现?

热门文章

  1. 计算机考试用户名和密码,计算机模块考试忘记了用户名和密码怎么办
  2. AcWing1090.绿色通道(单调队列DP)
  3. 深度学习——ReLU在x=0的时候是条线,为什么什么是非线性函数?
  4. Java中timer的schedule()和schedualAtFixedRate()函数的区别
  5. 突击计划——求n的阶乘
  6. Eclipse编辑python时的快捷键
  7. java基于jxl.jar包生成Excel文件到指定目录和服务器下载两种模式的使用方法
  8. 剑指offer——10.斐波那契数列
  9. 马虎的算式子 (枚举法)
  10. object references an unsaved transient instance - save the transient instance before flushing