socket有没有同步写一说(怎么判定数据一定达到了对端?还得用户态)

网络上的同步写和异步写和磁盘的同步和异步不一样

网络上的同步写是写到tcp的缓冲区中,如果缓冲区没有地方了,那么是直接返回给用户态程序还是让用户程序卡住,这个是阻塞和非阻塞发生的地方。

注意:阻塞是指tcp缓冲区中是否有数,然后在机器不重启的情况下,tcp协议会保证你的数据到达对端!!!!也就是tcp协议是一种同步的协议!tcp协议就是文件系统中的“同步写”,他会有各种各样的机制来保证数据一定会达到对端!当然了这一路可能发生各种各样的事情!比如我发送端机器异常重启了,比如对端机器down机了,比如中间路由器挂掉了,所以在网络传输中,是怎么判断数据到没到对端?

有没有一种语义,我这条数据一定达到了对端?只能通过用户态来保证了,比如收到了数据之后,返回一条确认数据,然后对端接收,返回一个确认收到的数据包,只有用户态才能做这件事情。

用户态怎么判定数据一定达到了对端?

tcp链接我们知道数据一定是对到达对端的,但是这些超时重传啊什么的,都是内核态的行为,用户态怎么知道数据发送到没有。

这就是tcp的同步,那么放到了tcp的缓冲区之后,到底是谁发送出去的呢?是当前线程还是别的线程捏?【一切与文件系统对标,哈哈哈哈哈】

阻塞!

原文地址:https://www.cnblogs.com/honpey/p/10111408.html

时间: 2024-11-10 05:57:15

socket有没有同步写一说(怎么判定数据一定达到了对端?还得用户态)的相关文章

socket编程的同步、异步与阻塞、非阻塞示例详解

socket编程的同步.异步与阻塞.非阻塞示例详解之一 分类: 架构设计与优化 简介图 1. 基本 Linux I/O 模型的简单矩阵 每个 I/O 模型都有自己的使用模式,它们对于特定的应用程序都有自己的优点.本节将简要对其一一进行介绍. 一.同步阻塞模式在这个模式中,用户空间的应用程序执行一个系统调用,并阻塞,直到系统调用完成为止(数据传输完成或发生错误). /* * \brief * tcp client */ #include <stdio.h> #include <stdlib

C#同步SQL Server数据库中的数据--数据库同步工具[同步新数据]

C#同步SQL Server数据库中的数据 1. 先写个sql处理类: using System; using System.Collections.Generic; using System.Data; using System.Data.SqlClient; using System.Text; namespace PinkDatabaseSync { class DBUtility : IDisposable { private string Server; private string

从socket can中断到netlink用户态内核态通信

1. Linux中的进程间的通信机制源自于Unix平台上的进程通信机制.Unix的两大分支AT&T Unix和BSD Unix在进程通信实现机制上的各有所不同,前者形成了运行在单个计算机上的System V IPC,后者则实现了基于socket的进程间通信机制.同时linux也遵循IEEE制定的posix IPC标准,在三者的基础上实现以下几种主要的IPC机制:管道(Pipe)和命名管道(Name Pipe),信号(Signal),消息队列(Message queue),共享内存(Shared

『数据库』随手写了一个 跨数据库 数据迁移工具

随手写了一个 跨数据库 的 数据迁移工具:>目前支持 SQLServer,MySql,SQLite: >迁移工具 可以自动建表,且 保留 主键,自增列: >迁移工具 基于 Laura.Source  ORM框架 开发: >迁移工具 支持 崩溃恢复(重启迁移工具,将会继续 未完成的 数据迁移): >每张表一个事务(即使  表中有 >100W 的数据,也是一个事务完成): >迁移后 的 自增列 和 原数据库 保持一致: 只是展示一下,直接上图片: 操作工具: 迁移工具

记录一次帮策划写的基于VBA的数据转化工具

由于策划计算的表格结构和程序实际使用的数据表结构不一定一致,因此有时候经常需要做数据转化.把策划自己的表格转成程序需要的格式,然后再导入数据库.这次也是策划有个表,里面有多个字段分别表示多个属性,但是程序考虑到通用,不想一个属性增加一个字段,因此想用一个字段,然后采用JSON格式来表示所有属性. 因此,帮策划写了个VBA实现多个字段合并成JSON的.这个VBA可以通过Ctrl表格来配置: 源表名:策划表的名字 目标表名:程序表的名字 字段映射:程序表的字段名对应策划表的字段名.目前支持字段合并(

为数据挖掘小组写的一个用于造数据的小程序

最近有个数据挖掘的项目,要求在文本里面写入随机字母并且要1000W个 于是就写了个程序用来造数据并记录一下 程序写的时候遇到的问题 1 未考虑内存溢出的情况,大批量的把数据写入导致内存溢出 以后需要谨慎对待 目前完整版 package test; import java.io.File; import java.io.FileWriter; import java.io.IOException; import org.apache.commons.io.FileUtils; import org

C++ socket编程——3种方法发送不同类型的数据

socket传送数据,一般来讲是char型的,如何传送我们需要的数据类型勒? 1.结构体:2, Json序列化,3. 定义一个class. 1.结构体 相对来说简单点,看看网上的一个例子: 假设需要传送的结构体如下: struct person{ char name[20]; int age; float high; }; 可在发送数据的地方对数据进行处理,将其转换成一个字符串进行传送,而在接受方定义相同的结构体对这个字符串进行解析即可. 发送方代码如下: char temp[100];   

通过FEDERATED存储引擎同步两实例间的表数据

需求情景:实例1中A库中的三个视图是实例2中的B库所依赖的,B需要A库中三个视图的实时数据. 方案:通过FEDERATED来完成跨势力的查询FEDERATED存储引擎表只会创建表结构,不会存储表数据,可以通过建表语句中的CONNECTION [=] 'connect_string'来指定访问远端数据的连接方式connect_string: scheme://user_name[:password]@host_name[:port_num]/db_name/tbl_name [http://dev

写一个循环,不断的问客户想买什么 ,当用户选择一个商品编号,就把对应的商品加入购物车 ,最终用户输入q退出时,答应购物车的商品

写一个循环,不断的问客户想买什么 ,当用户选择一个商品编号,就把对应的商品加入购物车 ,最终用户输入q退出时,答应购物车的商品products=[["Iphone8",68888],["MacpPro",14800],["Coffee",31],["小米",2499],["Book",80],["Nlke",799]]shopping_cart=[]print(".....商品