IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> 网络协议 -> socket编程中recv函数接收到的字符串乱码解决方法 -> 正文阅读

[网络协议]socket编程中recv函数接收到的字符串乱码解决方法

最近闲来无事,研究一下socket编程,尝试写一个邮箱服务器。但是在socket连接成功之后,使用recv()函数时出现了问题——recv接收到的字符串竟然是乱码,如下所示。

LiHua 烫烫烫烫烫烫烫烫烫烫烫烫烫烫烫烫烫烫烫烫葺葺sT▍?

调试了很久,一直在奔溃的边缘徘徊,最后发现竟然是个很小的错误导致的。果然,粗心是魔鬼。下面分享一下艰难的心路旅程,想直接看解决方法的小伙伴也可以跳过代码和图案往后看。(出于私心不建议这么做)

1.服务器端接收发送部分代码,通过客户端输入获得登录名和登录密码。

char User_Name[40];
char Passward[40];

char SendInf_1[40]; // "LogUp a UserName:" 
cin >> SendInf_1;
send(socket_accept, SendInf_1, 40, 0);
recv(socket_accept, User_Name, 40, 0);

char SendInf_2[40];// "Input Your Password:" 
cin >> SendInf_2;
send(socket_accept, SendInf_2, 40, 0);
recv(socket_accept, Passward, 40, 0);

2.客户端接收发送部分代码,为简化篇幅稍作删减。

char recv_buf[100];
char send_buf[100];
for(int i = 0; i < 2; i++){
	recv(s_server, recv_buf, 100, 0);
	cin >> send_buf;
	send(s_server, send_buf, 100, 0);
}

3.服务器端输入InputYourName和InputPassword。

在这里插入图片描述

4.客户端输入LiHua和123456789 在这里插入图片描述
5.结果像上面的那样,recv到的字符串变量User_Name = "LiHua",而”Password"却是一串乱码。

出错原因我众里寻他千百度,慕然回首,最终却发现是我的客户端与服务端传送的字符串不匹配。客户端发送的字符串send_buf长度为100字节;而服务端用于接收的字符串User_Name长度却为40字节,完全不够存放发送过来的数据。

在微软官网的winsock.h头文件使用手册中关于recv函数有下面这样一段说明。

If the datagram or message is larger than the buffer specified, the buffer is filled with the first part of the datagram, and recv generates the error WSAEMSGSIZE. For unreliable protocols (for example, UDP) the excess data is lost; for reliable protocols, the data is retained by the service provider until it is successfully read by calling recv with a large enough buffer.
如果数据报或消息大于指定的缓冲区,缓冲区将被数据报的第一部分填满,recv将生成错误WSAEMSGSIZE。对于不可靠的协议(例如UDP),多余的数据会丢失;对于可靠的协议,数据由服务提供商保留,直到通过调用具有足够大缓冲区的recv成功读取。

传送门——> recv function (winsock.h)

我么这里建立的TCP连接是可靠协议。也就是说recv的数据超过缓冲区大小buf时,超出的部分会保留,直到被下一个recv函数提取出来,另一端对应的send函数不再发挥作用,因此导致我的代码第二次接收出现字符串变量乱码,而不是我想要的123456789字符串值。

于是,我把发送和接收的字符串长度改成一样就可以了!!(如上客户端代码中所有的100改成40即可)

  网络协议 最新文章
使用Easyswoole 搭建简单的Websoket服务
常见的数据通信方式有哪些?
Openssl 1024bit RSA算法---公私钥获取和处
HTTPS协议的密钥交换流程
《小白WEB安全入门》03. 漏洞篇
HttpRunner4.x 安装与使用
2021-07-04
手写RPC学习笔记
K8S高可用版本部署
mySQL计算IP地址范围
上一篇文章      下一篇文章      查看所有文章
加:2021-08-06 10:11:58  更:2021-08-06 10:14:06 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 -2024/11/25 18:30:41-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码