socket客户端接收数据,是接收完又组包,还是一次接收一个整包
socket客户端接收数据,是接收完再组包,还是一次接收一个整包?
只有20分了,但是还有好几个问题想问一下,大家帮帮忙。。。
服务端发送的数据是 包头+包体,包头int指明包长度,现在我用两种方法来接收:
1。 首先接收一个包头,得到包体长度之后,再接收一个整包:
rv = recv( s, buf, 4, 0); //获取包头
但是 rv = recv( s, buf, 4, 0) 这句也有可能返回的不是4个字节(即使使用的无限时等待),例如是一个字节,2个字节,或者3个字节,请问这时是否应该再加一个循环,直到累计接收长度等于4为止? 因为仅仅是一个包头,感觉还是处理的有些复杂
2。 socket只负责接收数据,并拷贝到Buf中,外部程序不停的检测Buf,如果发现一个整包,就从Buf中剪切出这个包。
这儿有两个地方比较模糊:
第一是Buf,我现在使用的string, 有数据来就加到string中,检测到string中足够一个整包,则剪切出整包。Buf中剩余的部分累加到下次接收的数据中。 请问通常是这样做的吗? 使用vector或者deque,或者直接char数组更好些?
第二是如何来检测Buf中是否足够一个整包? 我现在使用的每隔一定时间来检测,先看包头,再看Buf中接收数据的长度,使用一个while循环,加上一个Sleep函数等待一定时间重新检测。这种方法比较简单粗暴, 请问通常应该怎么做?
多谢了!
------解决方案--------------------
1 是的,定长接收数据。
2 要接受多长的数据,是发送方决定的告诉接收方的,不是接收方决定的!
------解决方案--------------------
可以考虑全部接受了再分包
------解决方案--------------------
一个线程负责接收数据,把能接收的全部接收放入缓冲区,另外一个线程负责处理检测是否有足够的整包处理,有则处理,两个线程构成生产者-消费者模式
缓冲区,我用过的方法类似于:
struct buf{
char* pBuffer; //实际缓冲区指针,每次申请固定大小
int nLen; //缓冲区里有效的数据量
}
deque<buf*> 表示缓冲区列队
只有20分了,但是还有好几个问题想问一下,大家帮帮忙。。。
服务端发送的数据是 包头+包体,包头int指明包长度,现在我用两种方法来接收:
1。 首先接收一个包头,得到包体长度之后,再接收一个整包:
rv = recv( s, buf, 4, 0); //获取包头
但是 rv = recv( s, buf, 4, 0) 这句也有可能返回的不是4个字节(即使使用的无限时等待),例如是一个字节,2个字节,或者3个字节,请问这时是否应该再加一个循环,直到累计接收长度等于4为止? 因为仅仅是一个包头,感觉还是处理的有些复杂
2。 socket只负责接收数据,并拷贝到Buf中,外部程序不停的检测Buf,如果发现一个整包,就从Buf中剪切出这个包。
这儿有两个地方比较模糊:
第一是Buf,我现在使用的string, 有数据来就加到string中,检测到string中足够一个整包,则剪切出整包。Buf中剩余的部分累加到下次接收的数据中。 请问通常是这样做的吗? 使用vector或者deque,或者直接char数组更好些?
第二是如何来检测Buf中是否足够一个整包? 我现在使用的每隔一定时间来检测,先看包头,再看Buf中接收数据的长度,使用一个while循环,加上一个Sleep函数等待一定时间重新检测。这种方法比较简单粗暴, 请问通常应该怎么做?
多谢了!
------解决方案--------------------
1 是的,定长接收数据。
2 要接受多长的数据,是发送方决定的告诉接收方的,不是接收方决定的!
------解决方案--------------------
可以考虑全部接受了再分包
------解决方案--------------------
一个线程负责接收数据,把能接收的全部接收放入缓冲区,另外一个线程负责处理检测是否有足够的整包处理,有则处理,两个线程构成生产者-消费者模式
缓冲区,我用过的方法类似于:
struct buf{
char* pBuffer; //实际缓冲区指针,每次申请固定大小
int nLen; //缓冲区里有效的数据量
}
deque<buf*> 表示缓冲区列队