首先我要说这是一项家庭作业,我不是一名程序员。我已经做了好几天了,我被困住了。我已经从封面到封面阅读了beej指南,并且已经搜索了谷歌一周,是时候寻求帮助了。我有一个客户端 - 服务器TCP套接字应用程序,按预期发送和接收消息,现在我需要实现简单的文件上载/下载功能。
下面的代码几乎可以工作,但是它会在复制文件的开头添加4个字节,两个不可打印的字符后跟\ 00 \ 00,客户端不再响应。
使用select命令通过非阻塞套接字连接客户端。
我知道还有很大的改进空间,但有人可以帮助我开始吗?
//服务器
void put (int sockfd, char *localfile) {
// Get file Size
FILE *file;
int size;
file = fopen(localfile, "rb");
fseek(file, 0, SEEK_END);
size = ftell(file);
fseek(file, 0, SEEK_SET);
//Send file Size
write(sockfd, &size, sizeof(int));
//Send file as Byte Array
char send_buffer[size];
memset(send_buffer, 0, sizeof(send_buffer));
//while(!feof(file)) {
// fread(send_buffer, 1, sizeof(send_buffer), file);
// write(sockfd, send_buffer, sizeof(send_buffer));
// memset(send_buffer, 0, sizeof(send_buffer));
//}
int sent;
while((sent = fread(send_buffer, sizeof(char), sizeof(send_buffer), file)) > 0)
{
if(send(sockfd, send_buffer, sent, 0) < 0)
{
fprintf(stderr, "[Server] ERROR: Failed to send file %s. (errno = %d)\n", localfile, errno);
break;
}
memset(send_buffer, 0, sizeof(send_buffer));
}
fclose(file);
}
//客户端
void get(int sockfd, char *remotefile) {
FILE *file;
int size;
//Read file Size
read(sockfd, &size, sizeof(int));
//Read file Byte Array
char p_array[size];
memset(&p_array, 0, sizeof(p_array));
read(sockfd, p_array, size);
//Convert it Back into file
file = fopen(remotefile, "wb");
fwrite(p_array, 1, sizeof(p_array), file);
fclose(file);
}
答案 0 :(得分:3)
在读取套接字时,您通常会忽略读取计数,并假设每次读取都会填充缓冲区。你不能假设。
你的发送循环没有犯这个错误。因此,将其用作模型,但重做它以便接收,以便使用read()
而不是fread()
。然后,您应该看到不需要分配文件大小的缓冲区,因此不需要在文件之前发送文件大小,除非您计划为另一个目的保持连接打开。
也没有任何memset()
电话的原因。