其次删除不了里面的文件那就要看ftp服务器的目录设置的权限了,是否针对局域网内某电脑设置了诸如只读\写入\续传\重命名\删除\等权限,需要改动提供ftp服务的那台电脑的ftp服务器设置大哥,我不知道你用FTP在局域网里做什么。错误我也没遇到过。
我是这样处理局域网文件的:
1设置工作组,设置密码,设置共享。
2使用OFFICE的GROOVE软件。(离线可以处理文件,外网一样可以用)
你的方法比较老土了。我说二种方法都可以实现。要看你是通过何种方式传输的文件,如果直接通过共享,是没问题的。如果是通过一些软件比如qq一类传输文件的话,会因为一些安全设置自动改文件名。还有一些网站或者其他>客户机发送:
void sendFile(char filename[256], SOCKET cli_s)
{
using namespace std;
ifstream sendFile(filename, ios::binary); //二进制打开
sendFileseekg(0, ios::end); //定位文件尾部
int len = ftellg(); //取出文件长度
send(cli_s, &len, sizeof(len), 0); //发送文件长度
sendFileseekg(0, 0); //定位文件头部
char sendBuf[4096];
int readBytes;
while (!sendFileeof()){
readBytes = sendFileget(sendBuf, sizeof(sendBuf));
if (readBytes>0) //逐个发送,直到读不出数据
send(cli_s, sendBuf, readBytes, 0);
}
sendFileclose();
}
服务器接收:
void recvFile(char filename[256], SOCKET newsock)
{
using namespace std;
int len = 0;
recv(newsock, &len, sizeof(len), 0); //先接收文件长度
if (len==0)
return;
ofstream recvFile(filename, ios::out | ios::app | ios::binary);//二进制
char recvBuf[4096];
int receivedBytes;
while(len>0) { //len表示残余长度
receivedBytes = recv(newsock, recvBuf, sizeof(recvBuf), 0);
if (receivedBytes>0) { //读到数据了
recvFile << recvBuf;
len -= receivedBytes; //残余长度递减
}
}
recvFileclose();
}
strlen只对英文有效。如果是中文的话,strlen是不准确的。只能按照二进制的方式来读写文件。
如果按照二进制的方式进行网络传输的话,接收端无法知道何时结束接收。所以通常,在发送数据流之前,先发送出去数据长度,这样接收端就知道何时结束接收数据了。
缓冲太小的话,读写文件次数会增多,影响性能。缓冲太大的话,占用内存多,而且堆栈上分配不出大的缓存。一般写65536一下吧,更详细的可以自己百度去。
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)