C++多线程socket程序传送文件 10
多线程以及sockt都差不多了,之前调试能够传送数据流。后来我将文件转化成二进制数据流发送出去了,结果要不无限闪屏,要不毫无动静。client断处理代码while(tru...
多线程以及sockt都差不多了,之前调试能够传送数据流。后来我将文件转化成二进制数据流发送出去了,结果要不无限闪屏,要不毫无动静。client断处理代码
while(true)
{
char filename[256];
cout<<"请输入文件路径"<<endl;
cin>>filename;
ifstream sendFile(filename, ios::binary); //二进制打开
sendFile.seekg(0, ios::end); //定位文件尾部
char len = sendFile.tellg(); //取出文件长度
send(clientScoket, &len, sizeof(len), 0); //发送文件长度
sendFile.seekg(0, 0); //定位文件头部
char sendBuf[4096];
int readBytes;
while (!sendFile.eof()){
sendFile.get(sendBuf, sizeof(sendBuf));
readBytes = sendFile.get();
if (readBytes>0) //逐个发送,直到读不出数据
send(clientScoket, sendBuf, readBytes, 0);
}
sendFile.close();
if (RET == SOCKET_ERROR)
{
cout<<"send to error"<<endl;
break;
}
接收端 代码
char filename[256]={i,0};
i++;
while(true)
{
memset(RecvBuffer,0x00,sizeof(RecvBuffer));
char len = 0;
recv(ClientScoket, &len, sizeof(len), 0);
if (len=='0')
return 0;
ofstream recvFile(filename, ios::out | ios::app | ios::binary);
char recvBuf[4096];
int receivedBytes;
while(len!='0')
{
receivedBytes = recv(ClientScoket, recvBuf, sizeof(recvBuf), 0);
if (receivedBytes>0)
{
recvFile << recvBuf;
len -= receivedBytes;
}
}
recvFile.close();
cout<<"成功"<<endl;
}
全部源代码在百度盘http://pan.baidu.com/s/1eQ8ae5c上 我也是到处找的,求解惑。刚接触socket,没接触过多线程………… 展开
while(true)
{
char filename[256];
cout<<"请输入文件路径"<<endl;
cin>>filename;
ifstream sendFile(filename, ios::binary); //二进制打开
sendFile.seekg(0, ios::end); //定位文件尾部
char len = sendFile.tellg(); //取出文件长度
send(clientScoket, &len, sizeof(len), 0); //发送文件长度
sendFile.seekg(0, 0); //定位文件头部
char sendBuf[4096];
int readBytes;
while (!sendFile.eof()){
sendFile.get(sendBuf, sizeof(sendBuf));
readBytes = sendFile.get();
if (readBytes>0) //逐个发送,直到读不出数据
send(clientScoket, sendBuf, readBytes, 0);
}
sendFile.close();
if (RET == SOCKET_ERROR)
{
cout<<"send to error"<<endl;
break;
}
接收端 代码
char filename[256]={i,0};
i++;
while(true)
{
memset(RecvBuffer,0x00,sizeof(RecvBuffer));
char len = 0;
recv(ClientScoket, &len, sizeof(len), 0);
if (len=='0')
return 0;
ofstream recvFile(filename, ios::out | ios::app | ios::binary);
char recvBuf[4096];
int receivedBytes;
while(len!='0')
{
receivedBytes = recv(ClientScoket, recvBuf, sizeof(recvBuf), 0);
if (receivedBytes>0)
{
recvFile << recvBuf;
len -= receivedBytes;
}
}
recvFile.close();
cout<<"成功"<<endl;
}
全部源代码在百度盘http://pan.baidu.com/s/1eQ8ae5c上 我也是到处找的,求解惑。刚接触socket,没接触过多线程………… 展开
展开全部
从你代码上看貌似是发送多行文本。我看了下有几个问题,char len = sendFile.tellg();
怎么能用char呢,char只能到128,看看你的数组大小4096,是128的n倍。还有貌似你的
readBytes = sendFile.get();返回的是‘\n’的ansci码吧,怎么可以作为send的参数呢。
还有你怎么不用read函数读取整个文本呢,干嘛要一行行读取?你这么发送很不安全的!
怎么能用char呢,char只能到128,看看你的数组大小4096,是128的n倍。还有貌似你的
readBytes = sendFile.get();返回的是‘\n’的ansci码吧,怎么可以作为send的参数呢。
还有你怎么不用read函数读取整个文本呢,干嘛要一行行读取?你这么发送很不安全的!
追问
sendFile.tellg();这个函数返回值应该是当前get 流指针的位置(用tellg) 或put 流指针的位置,正好反映了流的长度. read 函数不太会用 我去翻翻书
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询