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,没接触过多线程…………
展开
 我来答
icelbja
2014-11-28 · TA获得超过138个赞
知道小有建树答主
回答量:180
采纳率:100%
帮助的人:151万
展开全部
从你代码上看貌似是发送多行文本。我看了下有几个问题,char len = sendFile.tellg();
怎么能用char呢,char只能到128,看看你的数组大小4096,是128的n倍。还有貌似你的
readBytes = sendFile.get();返回的是‘\n’的ansci码吧,怎么可以作为send的参数呢。
还有你怎么不用read函数读取整个文本呢,干嘛要一行行读取?你这么发送很不安全的!
追问
sendFile.tellg();这个函数返回值应该是当前get 流指针的位置(用tellg) 或put 流指针的位置,正好反映了流的长度. read 函数不太会用 我去翻翻书
推荐律师服务: 若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询

为你推荐:

下载百度知道APP,抢鲜体验
使用百度知道APP,立即抢鲜体验。你的手机镜头里或许有别人想知道的答案。
扫描二维码下载
×

类别

我们会通过消息、邮箱等方式尽快将举报结果通知您。

说明

0/200

提交
取消

辅 助

模 式