我在Linux上制作了一个FTP服务器,我在这里有一个获取文件名和大小的函数,创建一个文件大小的新文件 - 目的是在服务器上创建一个文件来自客户端(recvBuff)使用mmap。
我要做的是将recvBuff中的数据输入映射的内存(fp)。
我是否需要对映射内存进行实际写入? 文件创建正常,但内容为一组NULL(\ 00)。
所有参数都有值 - recvBuff是" hello world"并且大小不是0等等。
这可能与文件权限VS有关。 mmap权限或只是我没有正确地将数据复制到fp。
我确定这是一些愚蠢的事情,但我迷失了自己,看着它并使用printf进行调试。
由于
// recieve file from client
void put(int sockfd, char* fname, int fsize) {
int readen, nbytes,fd_src;
char recvBuff[fsize+1];
char path[256];
char cwd[1024];
char * src;
getcwd(cwd, sizeof(cwd));
sprintf(path,"/Server/%s", fname);
path[strlen(path)]='\0';
strcat(cwd,path);
strcpy(path,cwd);
printf("path:%s ,sockfd:%d , fname:%s, f_size: %d\n",path,sockfd,fname,fsize);
char* fp;
int fd;
if((fd = open(path, O_CREAT | O_RDWR | O_TRUNC, 0644)) < 0) //open new file for writing
perror("fd");
lseek (fd, fsize + 1, SEEK_SET);
write (fd, "", 1);
lseek (fd, 0, SEEK_SET);
if ((fp = mmap(0, fsize, PROT_WRITE | PROT_READ, MAP_PRIVATE, fd, 0)) == (caddr_t)-1)
perror("mmap for output");
if(fp== MAP_FAILED)
printf("mmap error\n");
ftruncate(fd, fsize);
while((readen = recv(sockfd, recvBuff, sizeof recvBuff, 0))>0) {
src=recvBuff;
memcpy(fp,src,readen);
if(readen == fsize){
munmap(fp,readen);
close(fd);
break;
}
}
if(readen == -1) {
perror("recv");
}
}