C 服务器套接字中的多个写入到单读取客户端套接字程序?
我已经看到了很多关于我要做什么的问题,但我还没有找到任何解决方案 我尝试编写两个套接字程序(一个客户端和一个服务器),以便服务器能够向客户端发送任何类型的文件(按字节)。我不确定如何构建/协调以下内容:C 服务器套接字中的多个写入到单读取客户端套接字程序?,c,sockets,tcp,C,Sockets,Tcp,我已经看到了很多关于我要做什么的问题,但我还没有找到任何解决方案 我尝试编写两个套接字程序(一个客户端和一个服务器),以便服务器能够向客户端发送任何类型的文件(按字节)。我不确定如何构建/协调以下内容: (在服务器中)从文件中获取数据的read语句(我使用的是fread()) (在服务器中)将数据发送到客户端的write语句(我正在使用write()) (在客户端中)从服务器接收数据的read语句(我使用的是read()) (在客户机中)将从服务器接收的数据写入文件的write语句(我使用的是f
/*try to get file from server*/
char receive_buffer[256];
FILE * new_file;
int bytes_received = 0;
new_file = fopen("newfile.txt", "w");
bytes_received = read(conn_s, receive_buffer, 256);
printf("Received %d bytes\n", bytes_received);
while( bytes_received > 0)
{
bytes_received = read(conn_s, receive_buffer, 256);
printf("Received %d bytes\n", bytes_received);
fwrite(receive_buffer, 1, bytes_received, new_file);
printf("writing bytes!\n");
break;
}
if(bytes_received < 0)
{
printf("/nError reading bytes of data/n");
}
/*尝试从服务器获取文件*/
字符接收缓冲区[256];
文件*新的_文件;
接收到的int字节=0;
new_file=fopen(“newfile.txt”,“w”);
字节接收=读取(连接,接收缓冲区,256);
printf(“已接收%d字节\n”,已接收字节);
同时(接收的字节数>0)
{
字节接收=读取(连接,接收缓冲区,256);
printf(“已接收%d字节\n”,已接收字节);
fwrite(接收缓冲区,1,接收字节,新文件);
printf(“写入字节!\n”);
打破
}
如果(接收的字节数小于0)
{
printf(“/n读取数据字节时出错/n”);
}
部分服务器代码:
FILE * file_to_get = fopen("sample.txt", "rb");
if(file_to_get == NULL)
{
printf("No such file!");
exit(0);
}
while(1)
{
unsigned char buff[256];
int num_read = fread(buff, 1, 256, file_to_get);
printf("read %d bytes\n", num_read);
if(num_read > 0)
{
write(conn_s, buff, num_read);
printf("writing %d bytes\n", num_read);
}
if(num_read < 256)
{
if(feof(file_to_get))
printf("End of file\n");
if(ferror(file_to_get))
printf("Error reading bytes\n");
break;
}
}
FILE*FILE_to_get=fopen(“sample.txt”、“rb”);
if(file_to_get==NULL)
{
printf(“没有这样的文件!”);
出口(0);
}
而(1)
{
无符号字符buff[256];
int num_read=fread(buff,1256,文件要获取);
printf(“读取%d字节”,num\u read);
如果(num_read>0)
{
写入(连接、buff、num\u读取);
printf(“写入%d字节”,num\u读取);
}
if(num_read<256)
{
if(feof(文件到获取))
printf(“文件结束\n”);
如果(ferror(文件到获取))
printf(“读取字节时出错\n”);
打破
}
}
发送到网络时,您可以使用对write()
的单个调用。如果内核中没有足够的缓冲区空间来处理整件事情,write()
将阻塞,直到它能够处理所有内容。你也可以分块写,也可以。这并不重要
从网络读取时,必须在循环中调用
read()
。调用read()
时指定的缓冲区大小正好是允许返回的最大值,它不会等待收到那么多。因此,它可以(而且经常)返回比这更少的值。只需继续调用read()
,直到它返回0
以指示EOF,将每个缓冲区写入文件。发送到网络时,您可以使用单个调用write()
。如果内核中没有足够的缓冲区空间来处理整件事情,write()
将阻塞,直到它能够处理所有内容。你也可以分块写,也可以。这并不重要
从网络读取时,必须在循环中调用
read()
。调用read()
时指定的缓冲区大小正好是允许返回的最大值,它不会等待收到那么多。因此,它可以(而且经常)返回比这更少的值。只需继续调用read()
,直到它返回0
以指示EOF,并将每个缓冲区写入文件。简单说明一下,确保检查每个系统调用是否失败(即fopen()
等)(参考客户端)。作为一般规则,您应该检查任何返回字节数的系统调用的返回值,并正确处理它返回的任何返回值。这意味着您需要在它返回与您传入的字节数相同的字节数时处理它(即完全读取/写入缓冲区),并且当它返回的值小于您传入的值(即缓冲区的部分读/写)时,您还需要对其进行处理。最后,当它返回0(也称为文件结尾)和-1(也称为错误)时,您需要对其进行处理。请注意,请确保检查每个系统调用是否失败(即,fopen()
),等等。(指您的客户端)。一般来说,您应该检查返回字节数的任何系统调用的返回值,并正确处理它返回的任何返回值。这意味着您需要在它返回与您传入的字节数相同的字节数时处理它(即完全读取/写入缓冲区),并且当它返回的值小于您传入的值(即缓冲区的部分读/写)时,您还需要处理它。最后,当它返回0(又名文件结尾)和-1(又名错误)时,您需要处理它。谢谢,(在服务器中)我从文件中读取一次,然后向网络写入一次?和(在客户端中)我从网络中读取,然后在循环中写入文件?是的,这是一种很好的方法。谢谢,(在服务器中)我从文件中读取一次,然后在网络中写入一次?并且(在客户端)我从网络中读取,然后在循环中写入文件?是的,这是一种很好的方法。