C++ 在循环中读取套接字应答

C++ 在循环中读取套接字应答,c++,sockets,C++,Sockets,我有: 但是,有时回复比320个字符大得多,所以我尝试在循环中运行read以避免占用太多内存空间。我试过readsoc、buf、sizeofbuf,但只会重复打印相同的前x个字符。如何打印循环中不适合前320个字符的剩余字符 谢谢每次调用read s、buf、buf_size时,内核都会将min buf_size、bytes_available复制到buf中,其中bytes_available是已接收并在套接字接收缓冲区中等待的字节数。read2系统调用返回放入应用程序缓冲区的字节数,或返回错误

我有:

但是,有时回复比320个字符大得多,所以我尝试在循环中运行read以避免占用太多内存空间。我试过readsoc、buf、sizeofbuf,但只会重复打印相同的前x个字符。如何打印循环中不适合前320个字符的剩余字符

谢谢

每次调用read s、buf、buf_size时,内核都会将min buf_size、bytes_available复制到buf中,其中bytes_available是已接收并在套接字接收缓冲区中等待的字节数。read2系统调用返回放入应用程序缓冲区的字节数,或返回错误时为-1,或返回0以表示EOF,即发送端套接字的close2。因此,当您重用缓冲区时,只有部分缓冲区可能会被新数据覆盖。还要注意,-1在C和C++中被评估为true。这很可能就是你所遇到的情况

printf3要求%s格式说明符的字符串以零结尾。从套接字读取的字节可能不包含“\0”字节,因此让printf3打印,直到它在下面的某个地方找到零为止。这可能会导致

这里的要点是:

始终检查从read2返回的值 如果打印从套接字读取的字符串-始终为零,请手动终止它们。 希望这有帮助。

每次调用read s,buf,buf_size时,内核都会将min buf_size,bytes_available复制到buf中,其中bytes_available是已接收并在套接字接收缓冲区中等待的字节数。read2系统调用返回放入应用程序缓冲区的字节数,或返回错误时为-1,或返回0以表示EOF,即发送端套接字的close2。因此,当您重用缓冲区时,只有部分缓冲区可能会被新数据覆盖。还要注意,-1在C和C++中被评估为true。这很可能就是你所遇到的情况

printf3要求%s格式说明符的字符串以零结尾。从套接字读取的字节可能不包含“\0”字节,因此让printf3打印,直到它在下面的某个地方找到零为止。这可能会导致

这里的要点是:

始终检查从read2返回的值 如果打印从套接字读取的字符串-始终为零,请手动终止它们。
希望这有帮助。

将您的循环更改为:

char buf[320];

read(soc, buf, sizeof(buf));
//print buf;

出于Nikola陈述的原因。

将您的循环更改为:

char buf[320];

read(soc, buf, sizeof(buf));
//print buf;

由于Nikola陈述的原因。

当读取SOC、buf、sizeofbuf PRINTFREPPLY:%s\n、buf;这是linux还是unix?read在错误时返回-1,该错误仍将计算为true,因此请检查read==-1。此外,您还需要将缓冲区终止为空,超出读取位置一个字节。whilereadsoc,buf,sizeofbuf printfReply:%s\n,buf;这是linux还是unix?read在错误时返回-1,该错误仍将计算为true,因此请检查read==-1。此外,您还需要在超出读取位置的一个字节处使用null终止缓冲区。最好让读取调用使用sizeofbuf-1而不是sizeofbuf,或者在数组结束后写入printf之前写入的null终止符字节。。。那是件坏事,谢谢你,杰里米。不要同时编写代码和观看《终结者》电影。@Duck:我试过你的代码,但没法用。我的代码在读取时停止,读取结果将返回0,因此循环将中断。不要像在崩溃中那样停止,而是像在循环中一样永远停止。你试过这个吗?这里有什么明显的错误吗?有没有可能我用错误的选项打开了插座?@Emil-过去的爆炸。我换了一个字母,但看起来没问题。返回0表示另一个端点已断开连接-可能您正在等待关闭的套接字?最好使读取调用采用sizeofbuf-1而不是sizeofbuf,或者在数组结束后写入printf之前写入的空终止符字节。。。那是件坏事,谢谢你,杰里米。不要同时编写代码和观看《终结者》电影。@Duck:我试过你的代码,但没法用。我的代码在读取时停止,读取结果将返回0,因此循环将中断。不要像在崩溃中那样停止,而是像在循环中一样永远停止。你试过这个吗?这里有什么明显的错误吗?有没有可能我用错误的选项打开了插座?@Emil-过去的爆炸。我换了一个字母,但看起来没问题。返回0表示另一个端点已断开连接-可能您只是在等待一个已关闭的套接字?