关于socket中recv的返回值
来源:互联网 发布:final java 变量 编辑:程序博客网 时间:2024/06/06 03:08
最近在做一个利用socket下载图片的小程序。基本思路就是建立socket以后自己组包然后发送过去,然后recv接收里面的数据里面就包含了图片数据信息。
一开始自己在写的时候,一直会遇到问题。关键代码如下:
char* WriteBuffer = (char *)malloc(1024 * 1024 * 2); //创建足够大的Buffer hPhoto = CreateFileA(FilePath, // 打开文件 GENERIC_WRITE, FILE_SHARE_WRITE, NULL, CREATE_ALWAYS, FILE_ATTRIBUTE_NORMAL, NULL); memset(WriteBuffer, 0, Length); //清空Buffer if (Length % 1024 == 0) //根据长度计算for循环的读取次数 Lun = Length / 1024 - 1; else Lun = Length / 1024; for (i = 0; i <= Lun; i++) { recv(LinkSocket, (char*)recvbuffer, 1024, 0); //接收数据 CopyMemory(WriteBuffer, recvbuffer, 1024); //将数据存入Buffer //Sleep(1); //这里一定要睡上一会。。。 memset(recvbuffer, 0, 1024); //清空临时Buffer WriteBuffer += 1024; } WriteBuffer -= 1024 * i; WriteFile(hPhoto, WriteBuffer, Length, &dwWritten,0); //写入文件操作 SetFilePointer(hPhoto, 0, NULL, FILE_END); CloseHandle(hPhoto);
每次都必须sleep睡一会儿才可以。如果是不写sleep的话,程序直接崩溃掉了。
由于百思不得其解,只好在CSDN上面请教大牛了。
下面是我错误的地方:
recv本身是阻塞模式的,这部分可以这样写:
int nRecvLen = 0; while ( nRecvLen < Length ) { int len = recv(LinkSocket, WriteBuffer + nRecvLen, 1024, 0); if ( len == 0 ) break; nRecvLen += len; } WriteFile(hPhoto, WriteBuffer, nRecvLen, &dwWritten, NULL); CloseHandle(hPhoto);
recv(LinkSocket, (char*)recvbuffer, 1024, 0);
请注意,recv的返回值的意义,你期望读取1024,实际返回可能只有1000,所以,你必须根据recv的返回值来确定,实际读取了多少数据
你的问题就出在这里了
给你写个大致的模板
bmplen=2000;//假设已经接受到图片的长度,假设为2000
int recvlen=0;
while(recv<2000)
{
int ret=recv(......);
memcpy(WriteBuffer+recvlen,buffer,ret);
recvlen=recvlen+ret;
}
大致就是这样了
}
每次写socket都有各种各样的错误,然后有各种各样的收获。
再次谢谢大家了。
下面附上论坛地址。
http://topic.csdn.net/u/20120721/17/a480efe0-15e3-44fb-a18c-ea9cf4909057.html?seed=291447330&r=79203312#r_79203312
- 关于socket中recv的返回值
- 关于recv()和send()的返回值
- 关于socket阻塞与非阻塞情况下的recv、send、read、write返回值
- 关于socket阻塞与非阻塞情况下的recv、send、read、write返回值
- 关于socket阻塞与非阻塞情况下的recv、send、read、write返回值
- 关于socket阻塞与非阻塞情况下的recv、send、read、write返回值
- 关于socket阻塞与非阻塞情况下的recv、send、read、write返回值
- 关于socket阻塞与非阻塞情况下的recv、send、read、write返回值
- 关于socket阻塞与非阻塞情况下的recv、seng、read、write返回值问题
- 关于socket阻塞与非阻塞情况下的recv、send、read、write返回值
- 关于socket阻塞与非阻塞情况下的recv、send、read、write返回值
- 关于socket阻塞与非阻塞情况下的recv、send、read、write返回值
- 关于socket阻塞与非阻塞情况下的recv、send、read、write返回值
- 关于socket阻塞与非阻塞情况下的recv、send、read、write返回值
- 关于socket阻塞与非阻塞情况下的recv、send、read、write返回值
- 关于socket阻塞与非阻塞情况下的recv、send、read、write返回值
- 关于socket阻塞与非阻塞情况下的recv、send、read、write返回值
- 关于socket阻塞与非阻塞情况下的recv、send、read、write返回值
- 使用JavaScript和Canvas开发游戏
- 清除n天以前的日志文件以及mysql-bin文件
- VC市场剧变:投资总额降低 流向少数大公司 小公司遭殃
- #pragma data_seg
- 八大排序算法
- 关于socket中recv的返回值
- 深入浅出 Javascript API(二)--地图显示与基本操作
- 请教一个关于UE编辑器ftp账号管理的设置问题
- Java单例模式探究
- Linux下gcc与g++用法以及编写makefile
- 更新moss2010工作流审批状态
- ORACLE全文搜索中文
- Android.Intent.Action
- c# 窗体嵌套