C++ 使用strncpy复制tcp流是否会导致故障?
我正在制作一个简单的代理服务器。我很难解析响应C++ 使用strncpy复制tcp流是否会导致故障?,c++,sockets,C++,Sockets,我正在制作一个简单的代理服务器。我很难解析响应 // Case 1 do { memset(buffer, 0, BUFSIZE); con = read(sockfd, buffer, BUFSIZE); write(client, buffer, con); } while(con); // Case 2 do { memset(buffer, 0, BUFSIZE); con = read(sockfd, buffer, BUFSIZE);
// Case 1
do {
memset(buffer, 0, BUFSIZE);
con = read(sockfd, buffer, BUFSIZE);
write(client, buffer, con);
} while(con);
// Case 2
do {
memset(buffer, 0, BUFSIZE);
con = read(sockfd, buffer, BUFSIZE);
size += con;
cachebuf = (char*)realloc(cachebuf, size);
strncpy(cachebuf+(size-con), buffer, con);
} while(con);
write(client, cachebuf, size);
这两个示例从终端服务器接收TCP流,并将其转发到浏览器。唯一的区别是,第一个在收到流后立即转发,第二个将流保存在cachebuf指针中并作为一个整体发送(我想使用这种情况)
它看起来是一样的,当它收到一个HTML文件时,两者都可以正常工作。但是,第二个无法发送图像。为什么会发生这种情况 您不能使用
strncpy
(和朋友)复制二进制数据。此函数复制字节,直到遇到nul终止符('\0'
)。二进制数据,特别是图像,有很多这样的字符,字符串函数不会完全复制它
要复制二进制数据,可以使用memcpy
或std::copy
另一方面,你的
memset
在read
之前是完全没有必要的,只会导致全球变暖,而没有做任何有用的事情。如果James真的将他的大小加上BUFSIZE,那么代码可以用当前缓冲区调用read(),从而节省memcpy的成本。@ZanLynx这是真的,但由于我不清楚中间realloc'ed buffer的整个概念,我只是假设它是实际问题的产物,并保持原样。谢谢,我误解了strncpy总是精确复制n个字符。@Zan Lynx谢谢你的建议。那是个好主意