我的主要任务是编写一个可以通过套接字传输大数据的工具。 我的代码背后的主要思想并不太复杂,所以我只是给出以下伪代码:
alignas( 4 ) struct package :
uint8_t type , is_eof , padding[ 2 ] ;
uint32_t size , checksum ;
uint8_t data[ large_size ] ;
function send :
read amount of data to the "package" ( with std::istream::read ) ;
form a "package" : load gcount() of read bytes, checksum, etc.
( hton* are used on this step ) ;
send "package" ( sendall from beej's guide ) ;
wait for approve package ;
function receive :
receive a "package" ( recv with MSG_WAITALL ) ;
unpack : calc checksum and check ( crc ), etc ;
write data to ostream ( std::ostream::write ) ;
send approve package ;
在常规构建(g ++ - 5)上,一切都按预期完美运行 - 发送者发送数据,接收者 接收,检查并发送响应。而且,由于我天真的基准 在LAN上,它的工作速度只比通过ftp传输慢1.5倍。)
但是当我添加' -pg'在几个包接收器之后,标记为g ++的选项 开始接收垃圾包。
有没有人知道发生了什么事。
答案 0 :(得分:0)
我不知道你是如何得到你的插座所以这是一个疯狂的猜测基于我在2003年左右看到的类似问题:
你有一些代码可以“帮助”关闭3到1024(或4096,或NOFILE等)的Unix文件描述符。然后重新使用FD 3作为套接字。
提示:配置文件使用文件描述符。
在我过去的类似问题中,在FD 3上打开的套接字被发送所有与预期数据交错的分析数据。
如果您没有打开它,请不要关闭它。