使用C for Linux中的套接字发送文件
我正在编写一个小而简单的服务器(在Linux工作站上使用C语言) 客户端向我的服务器请求一个文件,我的服务器向另一台服务器请求该文件,另一台服务器将其发送到我的服务器 我的服务器在将文件发送到客户端之前不应接收所有文件,但必须在文件到达时发送文件的字节 这是学校里的一个练习,所以我不能脱离这个要求 我已经实现了下面解释的功能。问题是,客户端接收到的字节数不确定,而不是整个文件使用C for Linux中的套接字发送文件,c,linux,sockets,C,Linux,Sockets,我正在编写一个小而简单的服务器(在Linux工作站上使用C语言) 客户端向我的服务器请求一个文件,我的服务器向另一台服务器请求该文件,另一台服务器将其发送到我的服务器 我的服务器在将文件发送到客户端之前不应接收所有文件,但必须在文件到达时发送文件的字节 这是学校里的一个练习,所以我不能脱离这个要求 我已经实现了下面解释的功能。问题是,客户端接收到的字节数不确定,而不是整个文件 int Recv_and_send_file (int socketa, int socketb, char *buff
int Recv_and_send_file (int socketa, int socketb, char *buffer, size_t file_size){
size_t n;
ssize_t nread;
ssize_t nwritten;
char c;
for (n=1; n<file_size; n++)
{
nread=recv(socketa, &c, 1, 0);
if (nread == 1)
{
nwritten = send(socketb,&c,1,0);
}
else if (nread == 0)
{
*buffer = 0;
return (-1); /* Errore */
}
else
return (-1); /* Errore */
}
}
*buffer = 0;
return (n);
}
int Recv_和int send_文件(int socketa、int socketb、char*buffer、size_t file_size){
尺寸;
ssize_t nread;
没有写的;
字符c;
for(n=1;n假设file\u size
是您要发送的总字节数,那么for
循环将只发送file\u size-1
字节。换句话说,您将禁用一个。改为从0
开始修复此问题:
for (n=0; n<file_size; n++)
{ //..
for(n=0;n为了优化性能和简化代码,您可以使用splice()+管道。Sendfile使您能够在文件描述符之间“转发”数据,而无需复制到用户空间。您确定复制了正确的代码吗?该部分不会编译,存在一个}在最后一个else中,它与对应的{
另外,您如何知道文件大小?如果它是以整数形式通过套接字发送的,请记住源计算机和目标计算机可能的字节顺序
无论如何,您每次读取一个字节,您应该通过以下方式进行改进:
编辑:使用缓冲区而不是额外的buff[2048]
int Recv_and_send_file (int socketa, int socketb, char *buffer, size_t file_size){
ssize_t nread;
ssize_t nwritten;
ssize_t bLeft=file_size;
while (bLeft > 0)
{
nread=recv(socketa, buffer, bleft, 0);
if (nread > 0)
{
nwritten = send(socketb, buffer, nread, 0);
bLeft -= nread;
buffer+=nread;
}
else if (nread == 0)
{
// I think this could raise a memory exception, read below
*buffer = 0;
return (-1); /* Errore */
}
else
{
return (-1); /* Errore */
}
}
// If buffer is allocated with file_size bytes this one will raise a memory exception
// *buffer = 0;
return (file_size-bLeft);
}
第二个服务器,在发送文件之前,将文件大小发送到我的服务器,以便在我的服务器上执行malloc并创建显示为函数输入的缓冲区。感谢您的回答我尽快尝试此代码!我不知道,缓冲区已经分配了足够的空间,因此代码会有所不同。不需要额外的buff[2048]。我将编辑响应以使其更好,并在缓冲区中保留文件内容。感谢您的回答,但我必须以显式方式发送每个字节的字节