Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/backbone.js/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 使用strncpy复制tcp流是否会导致故障?_C++_Sockets - Fatal编程技术网

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谢谢你的建议。那是个好主意