网络套接字socket的简介

以下内容源于C语言中文网的学习与整理,非原创,如有侵权请告知删除。

总结

socket的中文翻译是“套接字”,它是计算机之间进行通信的一种约定或一种方式。

套接字的典型应用就是web服务器和浏览器。

在Unix/Linux中,网络连接也是一个文件,遵循文件I/O操作的流程。

套接字按照数据传输方式分为:面向连接的套接字(流格式套接字),无连接的套接字(数据报格式套接字)

面向连接的套接字可以保证可靠的数据传输,因为它使用的是TCP协议。

无连接的套接字能够高效地传输数据,但不确保数据的可靠,它使用的是UDP协议。

一、socket是什么

1、socket的含义

socket 的原意是“插座”,在计算机通信领域,socket 被翻译为“套接字”,它是计算机之间进行通信的一种约定或一种方式。通过 socket 这种约定,一台计算机可以接收其他计算机的数据,也可以向其他计算机发送数据。

我们把插头插到插座上就能从电网获得电力供应,同样,为了与远程计算机进行数据传输,需要连接到因特网,而 socket 就是用来连接到因特网的工具。
 


socket 的典型应用就是 Web 服务器和浏览器:浏览器获取用户输入的 URL,向服务器发起请求,服务器分析接收到的 URL,将对应的网页内容返回给浏览器,浏览器再经过解析和渲染,就将文字、图片、视频等元素呈现给用户。

学习 socket,也就是学习计算机之间如何通信,并编写出实用的程序。

2、UNIX/Linux 中的socket

在 UNIX/Linux 系统中,为了统一对各种硬件的操作,简化接口,不同的硬件设备也都被看成一个文件。对这些文件的操作,等同于对磁盘上普通文件的操作。

你也许听很多高手说过,UNIX/Linux 中的一切都是文件!那个家伙说的没错。

为了表示和区分已经打开的文件,UNIX/Linux 会给每个文件分配一个 ID,这个 ID 就是一个整数,被称为文件描述符(File Descriptor)。例如:

  • 通常用 0 来表示标准输入文件(stdin),它对应的硬件设备就是键盘;
  • 通常用 1 来表示标准输出文件(stdout),它对应的硬件设备就是显示器。

UNIX/Linux 程序在执行任何形式的 I/O 操作时,都是在读取或者写入一个文件描述符。一个文件描述符只是一个和打开的文件相关联的整数,它的背后可能是一个硬盘上的普通文件、FIFO、管道、终端、键盘、显示器,甚至是一个网络连接。请注意,网络连接也是一个文件,它也有文件描述符!

我们可以通过 socket() 函数来创建一个网络连接,或者说打开一个网络文件,socket() 的返回值就是文件描述符。有了文件描述符,我们就可以使用普通的文件操作函数来传输数据了,例如:

  • 用 read() 读取从远程计算机传来的数据;
  • 用 write() 向远程计算机写入数据。

只要用 socket() 创建了连接,剩下的就是文件操作了,网络编程原来就是如此简单!

二、socket有哪些分类

这个世界上有很多种套接字,比如 DARPA Internet 地址(Internet 套接字)、本地节点的路径名(Unix套接字)、CCITT X.25地址(X.25 套接字)等。其中 Internet 套接字是最具代表性的,也是最经典最常用的。以后我们提及套接字,指的都是 Internet 套接字。

根据数据的传输方式,可以将 Internet 套接字分成两种类型:面向连接的套接字、无连接的套接字

通过 socket() 函数创建连接时,必须告诉它使用哪种数据传输方式。 

1、流格式套接字(SOCK_STREAM)

流格式套接字(Stream Sockets)也叫“面向连接的套接字”,在代码中使用 SOCK_STREAM 表示。

SOCK_STREAM 是一种可靠的、双向的通信数据流,数据可以准确无误地到达另一台计算机,如果损坏或丢失,可以重新发送。它有以下几个特征:

  • 数据在传输过程中不会消失;
  • 数据是按照顺序传输的;
  • 数据的发送和接收不是同步的(有的教程也称“不存在数据边界”)。

可以将 SOCK_STREAM 比喻成一条传送带,只要传送带本身没有问题(不会断网),就能保证数据不丢失;同时,较晚传送的数据不会先到达,较早传送的数据不会晚到达,这就保证了数据是按照顺序传递的。
 


为什么流格式套接字可以达到高质量的数据传输呢?

这是因为它使用了 TCP 协议(The Transmission Control Protocol,传输控制协议),TCP 协议会控制你的数据按照顺序到达并且没有错误。

你也许见过 TCP,是因为你经常听说“TCP/IP”。TCP 用来确保数据的正确性,而IP(Internet Protocol,网络协议)用来控制数据如何从源头到达目的地,即常说的“路由”。

那么,“数据的发送和接收不同步”该如何理解呢?

假设传送带传送的是水果,接收者需要凑齐 100 个后才能装袋,但是传送带可能把这 100 个水果分批传送,比如第一批传送 20 个,第二批传送 50 个,第三批传送 30 个。接收者不需要和传送带保持同步,只要根据自己的节奏来装袋即可,不用管传送带传送了几批,也不用每到一批就装袋一次,可以等到凑够了 100 个水果再装袋。

流格式套接字的内部有一个缓冲区(也就是字符数组),通过 socket 传输的数据将保存到这个缓冲区。接收端在收到数据后并不一定立即读取,只要数据不超过缓冲区的容量,接收端有可能在缓冲区被填满以后一次性地读取,也可能分成好几次读取。

也就是说,不管数据分几次传送过来,接收端只需要根据自己的要求读取,不用非得在数据到达时立即读取。传送端有自己的节奏,接收端也有自己的节奏,它们是不一致的。

流格式套接字有什么实际的应用场景吗?

浏览器所使用的 http 协议就基于面向连接的套接字,因为必须要确保数据准确无误,否则加载的 HTML 将无法解析。

2、数据报格式套接字(SOCK_DGRAM)

数据报格式套接字(Datagram Sockets)也叫“无连接的套接字”,在代码中使用 SOCK_DGRAM 表示。

计算机只管传输数据,不作数据校验,如果数据在传输中损坏,或者没有到达另一台计算机,是没有办法补救的。也就是说,数据错了就错了,无法重传。

因为数据报套接字所做的校验工作少,所以在传输效率方面比流格式套接字要高。

可以将 SOCK_DGRAM 比喻成高速移动的摩托车快递,它有以下特征:

  • 强调快速传输而非传输顺序;
  • 传输的数据可能丢失也可能损毁;
  • 限制每次传输的数据大小;
  • 数据的发送和接收是同步的(有的教程也称“存在数据边界”)。

众所周知,速度是快递行业的生命。用摩托车发往同一地点的两件包裹无需保证顺序,只要以最快的速度交给客户就行。这种方式存在损坏或丢失的风险,而且包裹大小有一定限制。因此,想要传递大量包裹,就得分配发送。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/460657.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

VB6 无法加载ieframe.dll,导致不能使用 浏览器控件--(转载)

VB6编程中,如果使用了WebBrowser控件,保存关闭工程后再次打开时会出现错误提示:文件未找到: c:\windows\sytem32\ieframe.dll\1--继续加载工程吗?然后你就发现原先的WebBrowser控件变成一个PictureBox了,无法正常使用。…

IP、MAC和端口号

以下内容源于C语言中文网资料的学习与整理,非原创,如有侵权请告知删除。 在茫茫的互联网海洋中,要找到一台计算机非常不容易,有三个要素必须具备,它们分别是 IP 地址、MAC 地址和端口号。 IP地址 IP地址是 Internet Pr…

Java保留小数点一位的方法

float result (float) (Math.round (result * 10)) / 10;要是保留两位:10 --> 100, 以此类推.转载于:https://blog.51cto.com/5934497/1588690

UML概述

UML视频一直在看,但是总觉得没有什么思路,知识都是零散的、片面的。最后复习阶段老师重新理了一下思路,我才觉得有点清晰了。所以,又回头把UML概述部分总结了一下。 感慨一句:思维导图真的要勤画,画图也是在…

TCP/IP模型简介(OSI模型的简化版)

以下内容源于C语言中文网的学习与整理,如有侵权请告知删除。 一、TCP/IP模型 1、模型的概念 OSI 是 Open System Interconnection 的缩写,译为“开放式系统互联”。OSI 模型把网络通信的工作分为 7 层,从下到上分别是物理层、数据链路层、网络…

Atitit.web预览播放视频的总结

Atitit.web预览播放视频的总结 1. 浏览器类型的兼容性(chrome,ff,ie) 1 2. 操作系统的兼容性 1 3. 视频格式的内部视频格式跟播放器插件的兼容性.. 2 4. 指定播放器 embed 模式 2 1. 浏览器类型的兼容性(chrome,ff,ie) <% if( mediaUrl.endsWith(".avi") || …

Android去掉listView,gridView等系统自带阴影

当我们使用listView的时候&#xff0c;拉到顶&#xff0c;或是拉到底部的时候&#xff0c;我们会发现有系统自带的阴影效果出现&#xff0c;不同手机出现的颜色可能还会不一样。 在以前我始终都有注意到此问题&#xff0c;一直以为是系统自带的&#xff0c;不能去掉。也没有想过…

图解TCP数据的传输(建立连接、数据传输、断开连接)

以下内容源于C语言中文网的学习与整理&#xff0c;非原创&#xff0c;仅作学习之用&#xff0c;如有侵权请告知删除。 TCP&#xff08;Transmission Control Protocol&#xff0c;传输控制协议&#xff09;是一种面向连接的、可靠的、基于字节流的通信协议&#xff0c;数据在传…

自定义Button,复写里面的onKeyDown,不起作用

李刚的Android疯狂讲义真是“疯狂”&#xff0c;浪费了3天时间&#xff0c;到底是他的代码有问题&#xff0c;还是怎么的不得而知。 问题描述&#xff1a;他的书里面第3.3基于回调事件处理Propagation的例程。是为了演示基于回调事件传播的例程序&#xff0c;源代码如下&#x…

JavaScript跨域总结与解决办法

什么是跨域1、document.domainiframe的设置2、动态创建script3、利用iframe和location.hash4、window.name实现的跨域数据传输5、使用HTML5 postMessage6、利用flash本文来自网络&#xff08;http://f2e.me/200904/cross-scripting/&#xff0c;该网址已不能访问&#xff09;&a…

与socket网络编程有关的函数

以下内容源于网络资源的学习与整理&#xff0c;如有侵权请告知删除。 基于TCP通信的服务模式 服务端 socket函数&#xff0c;获取网络连接的文件描述符 bind函数&#xff0c;将服务器的端口、ip地址与socket函数创建的文件描述符绑定 listen函数&#xff0c;监听服务器的当前端…

1609: [Usaco2008 Feb]Eating Together麻烦的聚餐

1609: [Usaco2008 Feb]Eating Together麻烦的聚餐 Time Limit: 10 Sec Memory Limit: 64 MB Submit: 1010 Solved: 606 [Submit][Status] Description 为了避免餐厅过分拥挤&#xff0c;FJ要求奶牛们分3批就餐。每天晚饭前&#xff0c;奶牛们都会在餐厅前排队入内&#xff0c…

转载Linq中GroupBy方法的使用总结

Group在SQL经常使用&#xff0c;通常是对一个字段或者多个字段分组&#xff0c;求其总和&#xff0c;均值等。 Linq中的Groupby方法也有这种功能。具体实现看代码&#xff1a; 假设有如下的一个数据集&#xff1a; public class StudentScore { public int ID { se…

例程:Linux下的socket演示程序1

server.cpp 是服务器端代码&#xff0c;client.cpp 是客户端代码。 要实现的功能是&#xff1a;客户端从服务器读取一个字符串并打印出来。 服务器端代码 server.cpp&#xff1a; #include <stdio.h> #include <string.h> #include <stdlib.h> #include &…

在Atom中运行脚本

2019独角兽企业重金招聘Python工程师标准>>> 现在可以在atom官网&#xff08;https://atom.io/&#xff09;找到deb包。 插件script可以让atom运行脚本&#xff0c;具体请见&#xff1a;https://atom.io/packages/script。 下面大致讲一下如何使用。 安装atom后&…

例程:socket编程实现文件传输功能

程序要实现的功能&#xff1a;client 从 server 下载一个文件并保存到本地。 编写这个程序需要注意两个问题&#xff1a; &#xff08;1&#xff09;文件大小不确定 有可能比缓冲区大很多&#xff0c;调用一次 write()/send() 函数不能完成文件内容的发送。接收数据时也会遇…

js中的this

在面向对象编程语言中&#xff0c;对于this关键字我们是非常熟悉的。比如C、C#和Java等都提供了这个关键字&#xff0c;虽然在开始学习的时候觉得比较难&#xff0c;但只要理解了&#xff0c;用起来是非常方便和意义确定的。JavaScript也提供了这个this关键字&#xff0c;不过用…

在 Windows Azure 上部署并定制化 FreeBSD 虚拟机镜像

&#xfeff;&#xfeff;发布于 2014-12-11作者 陈阳FreeBSD 基础镜像现已登陆中国的 VM Depot&#xff01; 对于青睐 BSD 而非 Linux 的开源爱好者来说&#xff0c;这无疑是个好消息。同时&#xff0c;随着该基础镜像的可用&#xff0c;我们期待很快看到更多来自社区的基于 F…

man命令:查找linux命令、API或者C库函数

可以使用man命令。 man 1 xxx 1表示查找linux命令&#xff0c;比如 man 1 ls man 2 xxx 2表示查找linux API &#xff0c;比如 man 2 socket man 3 xxx 3表示查找C库函数&#xff0c;比如 man 3 print

关于在asp.net中播放MP4格式的视频(好吧,只兼容支持html5的浏览器,ie8及以下的都歇菜了)...

项目要求只能播放MP4格式的视频&#xff0c;同事的播放器在我这里不完全管用&#xff0c;对于部分mp4格式的视频编码不支持&#xff0c;所以各种在网上找&#xff0c;在http://www.iteye.com/problems/75503问答的一个网友答案中找到了适合项目中当前mp4格式的播放器&#xff0…