每周工作学习总结(三月第3周)

Socket通信

本周首先要进行的是改进数据的传输
在之前的工作中,在传输数据量比较大时(>1024Byte)时,我才用了在服务端分段传输,即将每个缓冲区设置为1024字节,然后计算分的段数,使用for循环进行循环发送。
后来发现在接收时会出现数据接收不完整,或者数据粘连的现象。为了解决这个问题,我在网上翻了不少的帖子,都没有什么解决办法。大部分都是将在传输时,先传输数据的大小之类,并且例子中的数据量并不是很大。
终于在后来发现了一个帖子,是在堆上创建一个整个数据量大小的缓冲区,然后使用while循环进行发送,具体代码如下

while(size>0)
{
	int ret=send(client,buffer,size,0);
	if(SOCKET_ERROR==ret)
		return false;
	size-=ret;
	buffer+=ret;
}

在我自己使用的过程中,发现4M左右的数据是可以一次传输完的,并且在客户端上也是可以一次收完的。
在客户端方面,原来使用的是异步的方式,采取时间的触发,但是在连续多次recv数据时,好像需要关闭READ的触发,总之在之前使用异步时,经常会接收到乱码。
这周我将client端的接收模式改成了多线程同步模式,创建一个单独的线程来进行接收服务器端的数据,由于我需要发送和接收的数据只有几种固定的类型,所以我在每个包前面加上了int型的4字节的类型校验,然后是4字节的int型数据量,在数据的最后以为添加了1字节char型的字符校验,目前来看整体的传输效果还不错。
下面附上接收端的代码

while(size>0)
{
	int ret=recv(socket,buffer,size,0);
	if(SOCKET_ERROR==ret)
		return false;
	size-=ret;
	buffer+=ret;
}

两者之间一脉相承。

Vector容器的一些问题

在进行数据的处理时,使用了vector容器来储存原始数据和结果,在编程调试过程中,vector容器经常报错。
其中我遇到的大部分的错误都是由于使用的下标超出了范围。在实践中,我主要使用了vector共遇到了两种错误代码

1、vector iterator + offset out of range

这个代码是我在使用vector.back()时遇到的,当时我在对vector容器取末尾值进行数据比较,可以肯定的时整个容器不是空的,在前面一句对vector的相关操作时vector.push_back()添加最后一个数据。
后来改用了vector.at(size()-1)来替代vector.back()。
(错误的原因我猜想时在添加数据时重新开辟了新的地址,但是迭代器的地址还没更新?)

2、vector subscript out of range

这个原因就很简单,大部分时因为下标越界了,要不就是容器是空的。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值