使用套接字c ++正确发送和接收二进制文件
send and receive binary files properly using sockets c++
你好stackflow用户,
所以我想在 C++ 中使用套接字发送和接收我的二进制文件,这是我从服务器程序发送它的方式
send(Connections[conindex], reinterpret_cast<char*>(rawData), sizeof(rawData), NULL);
这是我的客户端程序接收它的方式
char raw[647680];
recv(Connection, raw, sizeof(raw), NULL);
还有比这更合适的方法吗?我想要这样我就不必每次都对大小进行硬编码。
或任何其他替代品等
一个相当通用的实现方式(在 C 和 C++ 中)是这样的:
if (FILE *fp = fopen(filename, "rb"))
{
size_t readBytes;
char buffer[4096];
while ((readBytes = fread(buffer, 1, sizeof(buffer), fp) > 0)
{
if (send(Connections[conindex], buffer, readBytes, 0) != readBytes)
{
handleErrors();
break;
}
}
close(Connections[conindex]);
}
在客户端:
if (FILE *fp = fopen(filename, "wb"))
{
size_t readBytes;
char buffer[4096];
while ((readBytes = recv(socket, buffer, sizeof(buffer), 0) > 0)
{
if (fwrite(buffer, 1, readBytes, fp) != readBytes)
{
handleErrors();
break;
}
}
}
这种 FTP-esque 连接方式的替代方案包括首先发送文件的大小,因此客户端将知道何时停止侦听而不是等待断开连接。
请注意,此代码未经测试,仅用于说明概念。
你好stackflow用户,
所以我想在 C++ 中使用套接字发送和接收我的二进制文件,这是我从服务器程序发送它的方式
send(Connections[conindex], reinterpret_cast<char*>(rawData), sizeof(rawData), NULL);
这是我的客户端程序接收它的方式
char raw[647680];
recv(Connection, raw, sizeof(raw), NULL);
还有比这更合适的方法吗?我想要这样我就不必每次都对大小进行硬编码。 或任何其他替代品等
一个相当通用的实现方式(在 C 和 C++ 中)是这样的:
if (FILE *fp = fopen(filename, "rb"))
{
size_t readBytes;
char buffer[4096];
while ((readBytes = fread(buffer, 1, sizeof(buffer), fp) > 0)
{
if (send(Connections[conindex], buffer, readBytes, 0) != readBytes)
{
handleErrors();
break;
}
}
close(Connections[conindex]);
}
在客户端:
if (FILE *fp = fopen(filename, "wb"))
{
size_t readBytes;
char buffer[4096];
while ((readBytes = recv(socket, buffer, sizeof(buffer), 0) > 0)
{
if (fwrite(buffer, 1, readBytes, fp) != readBytes)
{
handleErrors();
break;
}
}
}
这种 FTP-esque 连接方式的替代方案包括首先发送文件的大小,因此客户端将知道何时停止侦听而不是等待断开连接。
请注意,此代码未经测试,仅用于说明概念。