-
数据的“粘包”问题
所属栏目:[语言] 日期:2023-05-24 热度:1713
假设我们希望客户端每次发送一位学生的学号,让服务器端返回该学生的姓名、住址、成绩等信息,这时候可能就会出现问题,服务器端不能区分学生的学号。例如第一次发送 1,第二次发送 3,服务器可能当成 13 来处理,返[详细]
-
socket阻塞模式
所属栏目:[语言] 日期:2023-05-24 热度:8244
对于TCP套接字(默认情况下),当使用 write()/send() 发送数据时:
1) 首先会检查缓冲区,如果缓冲区的可用空间长度小于要发送的数据,那么 write()/send() 会被阻塞(暂停执行),直到缓冲区中的数据被发送到目[详细] -
socket缓冲区
所属栏目:[语言] 日期:2023-05-24 热度:8995
每个 socket 被创建后,都会分配两个缓冲区,输入缓冲区和输出缓冲区。
write()/send() 并不立即向网络中传输数据,而是先将数据写入缓冲区中,再由TCP协议将数据从缓冲区发送到目标机器。一旦将数据写入到缓冲区[详细] -
Windows下数据的接收和发送
所属栏目:[语言] 日期:2023-05-24 热度:7704
Windows 和 Linux 不同,Windows 区分普通文件和套接字,并定义了专门的接收和发送的函数。
从服务器端发送数据使用 send() 函数,它的原型为:
int send(SOCKET sock, const char *buf, int len, int flags);[详细] -
Linux下数据的接收和发送
所属栏目:[语言] 日期:2023-05-24 热度:1977
Linux 不区分套接字文件和普通文件,使用 write() 可以向套接字中写入数据,使用 read() 可以从套接字中读取数据。
前面我们说过,两台计算机之间的通信相当于两个套接字之间的通信,在服务器端用 write() 向套接[详细] -
accept() 函数
所属栏目:[语言] 日期:2023-05-24 热度:9077
当套接字处于监听状态时,可以通过 accept() 函数来接收客户端请求。它的原型为:
int accept(int sock, struct sockaddr *addr, socklen_t *addrlen); //Linux
SOCKET accept(SOCKET sock, struct sockaddr *a[详细] -
listen() 函数
所属栏目:[语言] 日期:2023-05-24 热度:1786
通过 listen() 函数可以让套接字进入被动监听状态,它的原型为:
int listen(int sock, int backlog); //Linux
int listen(SOCKET sock, int backlog); //Windows
sock 为需要进入监听状态的套接字,backlog [详细] -
Linux 下的 socket() 函数
所属栏目:[语言] 日期:2023-05-24 热度:9287
在 Linux 下使用 <sys/socket.h> 头文件中 socket() 函数来创建套接字,原型为:
int socket(int af, int type, int protocol);
1) af 为地址族(Address Family),也就是 IP 地址类型,常用的有 AF_INET 和 AF[详细] -
IP、MAC和端口号
所属栏目:[语言] 日期:2023-05-24 热度:2325
IP地址是 Internet Protocol Address 的缩写,译为“网际协议地址”。
目前大部分软件使用 IPv4 地址,但 IPv6 也正在被人们接受,尤其是在教育网中,已经大量使用。
一台计算机可以拥有一个独立的 [详细] -
OSI模型把网络通信教程
所属栏目:[语言] 日期:2023-05-24 热度:6164
如果你读过计算机专业,或者学习过网络通信,那你一定听说过 OSI 模型,它曾无数次让你头大。OSI 是 Open System Interconnection 的缩写,译为“开放式系统互联”。
OSI 模型把网络通信的工作分为 7 层[详细] -
数据报格式套接字
所属栏目:[语言] 日期:2023-05-24 热度:1799
数据报格式套接字(Datagram Sockets)也叫“无连接的套接字”,在代码中使用 SOCK_DGRAM 表示。
计算机只管传输数据,不做数据校验,如果数据在传输中损坏,或者没有到达另一台计算机,是没有办法补救[详细] -
面向连接的套接字
所属栏目:[语言] 日期:2023-05-24 热度:7171
流格式套接字(Stream Sockets)也叫“面向连接的套接字”,在代码中使用 SOCK_STREAM 表示。
SOCK_STREAM 是一种可靠的、双向的通信数据流,数据可以准确无误地到达另一台计算机,如果损坏或丢失,可以[详细] -
什么是 socket
所属栏目:[语言] 日期:2023-05-24 热度:6939
socket 的原意是“插座”,在计算机通信领域,socket 被翻译为“套接字”,它是计算机之间进行通信的一种约定或一种方式。通过 socket 这种约定,一台计算机可以接收其他计算机的数据,也可以向[详细]
-
使用折半查找来代替顺序查找
所属栏目:[语言] 日期:2023-05-24 热度:6209
如果你善于思考就会发现该算法在查找插入位置时,采用的是顺序查找的方式,而在查找表中数据本身有序的前提下,可以使用折半查找来代替顺序查找,这种排序的算法就是折半插入排序算法。
该算法的具体代码实现为:[详细] -
哈希表的构建
所属栏目:[语言] 日期:2023-05-23 热度:2281
哈希表的建立同函数类似,把函数中的 x 用查找记录时使用的关键字来代替,然后将关键字的值带入一个精心设计的公式中,就可以求出一个值,用这个值来表示记录存储的哈希地址。即:
数据的哈希地址=f(关键字的值)[详细] -
顺序查找的性能分析
所属栏目:[语言] 日期:2023-05-23 热度:9641
查找操作的性能分析主要考虑其时间复杂度,而整个查找过程其实大部分时间花费在关键字和查找表中的数据进行比较上。
所以查找算法衡量好坏的依据为:查找成功时,查找的关键字和查找表中的数据元素中进行过比较的[详细] -
顺序查找的实现
所属栏目:[语言] 日期:2023-05-23 热度:9781
通过前面对静态查找表的介绍,静态查找表即为只做查找操作的查找表。
静态查找表既可以使用顺序表表示,也可以使用链表结构表示。虽然一个是数组、一个链表,但两者在做查找操作时,基本上大同小异。
本节以静态[详细] -
数据结构查找表。
所属栏目:[语言] 日期:2023-05-23 热度:8761
在日常生活中,几乎每天都要进行一些查找的工作,在电话簿中查阅某个人的电话号码;在电脑的文件夹中查找某个具体的文件等等。本节主要介绍用于查找操作的数据结构——查找表。
查找表是由同一类型的数[详细] -
回收算法
所属栏目:[语言] 日期:2023-05-23 热度:2228
在用户活动完成,系统需要立即回收被用户占用的存储空间,以备新的用户使用。回收算法中需要解决的问题是:在若干次分配操作后,可利用空间块中会产生很多存储空间很小以致无法使用的空闲块。但是经过回收用户释放的[详细]
-
分配算法
所属栏目:[语言] 日期:2023-05-23 热度:740
当用户申请空间时,系统可以采用 3 种分配方法中的任何一种。但在不断地分配的过程中,会产生一些容量极小以至无法利用的空闲块,这些不断生成的小内存块就会减慢遍历分配的速度。
选定一个常量 e,每次分配空间时[详细] -
广义表的原子和子表
所属栏目:[语言] 日期:2023-05-23 热度:1244
通常,广义表中存储的单个元素称为 "原子",而存储的广义表称为 "子表"。
例如创建一个广义表 LS = {1,{1,2,3}},我们可以这样解释此广义表的构成:广义表 LS 存储了一个原子 1 和子表 {1,2,3}。
以下是广义表[详细] -
什么是广义表
所属栏目:[语言] 日期:2023-05-23 热度:1950
数组即可以存储不可再分的数据元素(如数字 5、字符 'a'),也可以继续存储数组(即 n 维数组)。
但需要注意的是,以上两种数据存储形式绝不会出现在同一个数组中。例如,我们可以创建一个整形数组去存储[详细] -
BF算法实现
所属栏目:[语言] 日期:2023-05-23 热度:4968
BF 算法的实现思想是:将用户指定的两个串 A 和串 B,使用串的定长顺序存储结构存储起来,然后循环实现两个串的模式匹配过程,C 语言实现代码如下:
#include <stdio.h>
#include <string.h>
//串普通模式匹配算[详细] -
串的块链存储结构
所属栏目:[语言] 日期:2023-05-23 热度:6510
串的块链存储,指的是使用链表结构存储字符串。
本节实现串的块链存储使用的是无头节点的单链表。当然根据实际需要,你也可以自行决定所用链表的结构。
我们知道,单链表中的 "单" 强调的仅仅是链表各个节点只[详细] -
串的堆分配存储结构
所属栏目:[语言] 日期:2023-05-23 热度:738
串的堆分配存储,其具体实现方式是采用动态数组存储字符串。
通常,编程语言会将程序占有的内存空间分成多个不同的区域,程序包含的数据会被分门别类并存储到对应的区域。拿 C 语言来说,程序会将内存分为 4 个区[详细]
