第一,他必须承担首当其冲的罪魁祸首。
TCP是一种传输层协议,是一种连接的、安全的、以流动为基础的传输协议,由于数据传输以流动为基础,由发送者和接收端处理的数据数量可以以非对等的频率处理,并且可以根据其自身的需要确定。TPP协议显然有利,但有时会激怒我们。
基于 TCP 的客户端和服务器之间的套接字连接通讯
- 在整个通信过程中,客户将给定字符串的无限长度传送给服务器。
- 服务器每次通信时必须接收并分析客户端字符串的未定长度 。
根据前述说明,服务器在下列情况下获得数据:
- 一个客户的全部数据包立即全部收到。
- 同时收到了客户提供的无数据包,由于每包的长度不明,无法分开。
- 一次获得一个或N数据集,作为下一个数据包的一部分,却无法解脱数据包,这仍然很可怕。
- 我第一次拿到一半的数据包, 之后我拿到了剩下的数据包。
- 还有其他不可避免的因素:例如,客户与服务器之间的网络速度波动,交付和接收的数据数量参差不齐。
我们有时会把这些现象称为TCP的粘粘袋,但这是不正确的, 因为TCP本身是连接的流程传输协议, 这就是我们所说的, TCP是一个问题, 而这仅仅是用户的无知。 几个数据包不能一起分割, 是由于我们的要求的复杂性, 过程的复杂问题, 而不是协议的复杂问题, TCP 协议是这样说的。因此,问题是,如果服务器希望确保每次收到客户提供的数据包的无限长度,猴子应该如何解决这个问题?
- 使用标准层协议(如TCP/IP),https, https, https)用来封装将转让的无限期数据包。
- 每个数据集结尾处附加特殊字符,如果符合特殊字符,则表示收到数据。
- 缺陷:效率低,一个字节的字节接收一个字节,以确定字符串是否属于例外。
- 当数据由两个部分组成:数据头和数据块时,在数据块的开头加上一个固定大小的页眉,然后才能传输数据块。
- 页眉:持有当前数据包的总字节;在接收页眉时,最初收到与数据页眉大小相匹配的字节。
- 本数据包的内容称为块。
2. 解决方案
如果使用 TCP Socket 通讯 。 如果所提供的数据包被粘合在一起, 而接收端无法解决问题, 我们通常会很容易地通过添加头部来解决这个问题 。 这里没有具体的必要性, 所以头部的固定大小被设为四个字节, 用来保持当前数据板的总字节 。
2.1 发送端
数据分四个阶段传送给发送者:
- N4( 4 是占住头数 ) 动态请求: N4( 4) 是占住头数 )
- 写入要传输到应用程序初始四字节的数据的完整长度, 该字节必须更改为网络字节顺序( 大结尾 ) 。
- 复制要传送到信头后面地址空间的数据, 并发送整个软件包( 字符串没有字节顺序问题 ) 。
- 释放申请的堆内存。
由于发件人必须总是发送整个软件包,所以它可以创建一个发件人函数,如果当前软件包中的数据没有发送,该函数将始终发送。以下是处理代码:
/*
职能说明:转交所提供的字节数。
函数参数:
- fd: 通信文件说明(套)
- 电文: 原始数据将发送
- 大小:要交付的原始数据的字节总数。
函数返回值: 一个成功函数调用返回发送的字节编号, 而一个失败函数调用返回 - 1 。
*/
int writen(int fd, const char* msg, int size)
{
const char* buf = msg;
int count = size;
while(count > 0)
{
int len = send(fd, buf, count, 0);
if(len == -1)
{
close(fd);
return-1;
}
else
if(len == 0)
{
continue;
}
buf = len;
count -= len;
}
returnsize;
}
您可以使用此功能提供袋式数据块,如下所示:
/*
提供带有使用此函数的数据头的数据包。
函数参数:
- 参考:通信文件说明(集)
- 电文: 原始数据将发送
- 交付的原始数据字节总数。
函数返回值: 一个成功函数调用返回发送的字节编号, 而一个失败函数调用返回 - 1 。
*/
int sendMsg(int cfd, char* msg, int len)
{
if(msg == NULL || len <= 0 || cfd <=0)
{
return-1;
}
/ 请求的内存空间:数据长度4字节(存储数据长度)
char* data = (char*)malloc(len 4);
int bigLen = htonl(len);
memcpy(data, 本文由 在线网速测试 整理编辑,转载请注明出处,原文链接:https://www.wangsu123.cn/news/12221.html。