解决方案 »
- 】自定义类中如何使用SetTimer
- ADO方式下,执行_ConnectionPtr::Open打开数据库,如果登陆密码错误会怎么样?
- 谁给个ListBox控件操作的例子 SDK程序
- 在VC++6宝典的例子中,CDIB类中如何取得任意点的像素值?
- 全局结构体的问题
- 构造函数的问题
- 救人一命胜造7级浮屠,有请所有会Soap toolkit2.0的大虾前来救命,小弟还年青........................
- SlaSK进来拿分!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
- 在c++的MFC中增加datagrid的列
- 怎么多显示4个线程啊
- 求如何用direct 读取 图片在窗口显示
- qt, wtl, mfc 等界面库的优缺点,应用场合
1,看看协议有没有问题
2,看看断点续传时偏移位置是否正确
3,发送的时候在本地目录WriteFile一份,校验一下MD5
2.这个应该没有问题,因为大多数情况下文件都是好的,只是偶尔会出现这个问题。
3.我现在试试,发送时保存一份,看看是否是否是发出时就已经错了。
谢谢你的提议。
这是什么东西?
一个50多M的文件 发送过来以后 就坏了
上面是好的 下面是坏的 就这32个字节不一样
不知道为什么这32个字节会变成OK..Server: nginx/0.6.39..Date:这样的数据?
char recvBuf[SENDBUF]={0};
int temp1=0; while((x<con))
{
memset(recvBuf,0,SENDBUF);
temp1=recv(sock1,recvBuf,SENDBUF,0);
if (temp1>0)
{
out.Write(recvBuf,temp1);
}
else
{
out.Close();
closesocket(sock1);
WaitForSingleObject(hMutex,INFINITE);
theApp.iTransThreadNum--;
ReleaseMutex(hMutex);
CString ss;
ss.Format("TIME OUT 4");
theApp.addlog(ss);
cba--;
return -1;//未正常接收完毕,客户端断开了连接
}
x+=temp1;
WaitForSingleObject(theApp.hMutex,INFINITE);
theApp.llDownByte+=temp1;
ReleaseMutex(theApp.hMutex);
}
这是接收端的代码 能不能帮忙看看?谢谢。
你可以把程序换个机器去测试看看
我在别的N台机器上测试了N多遍,没有出现这个问题,传过去的文件都是好的。
貌似就是你说的问题啊。但是出问题的机器没有用无线网卡啊。难不成是集成网卡的问题?
我先更新下驱动试试。
我qq是641709408,方便加我一下么?以后可以互相交流一下,谢谢。
http://msdn.microsoft.com/en-us/library/windows/desktop/ms740565(v=vs.85).aspx
没有详细看你的代码. 但是看到了那张对比图. 所以说个大概.1.如果是自己设计的文件传输, 用固定的结构体通知双方, 让其知道要传输的文件有多大.
然后在SOKET里一个发一个接, 在最后完成后, 再进行一次确认, 好像我的这种设计从来没出过问题.2. 如果你是从HTTP服务器下载东西, 要了解HTTP协议的细节, 也编写过纯SOCKET的函数用于和WEB服务器
通讯和下载文件. 关键两个, 你也要知道你要下载的文件有多大; 什么时候开始创建文件和写文件和关闭文件句柄.
有些WEB服务器会告诉你你要下载的文件有多大, 而有些则不会.看你的对比图, 好像你把HTTP头里的一些内容写入了文件. 这是错误的起点. 也就是你何时开始写入本地文件文件的判断代码
有问题.还有,不要轻易怀疑驱动以及协议. 这些东西都比你我古老可靠多了.
send(人多)send(病少)send(财富)
recv(人多病)recv(少财富)
陷阱里面啊!
http://bbs.csdn.net/topics/380167545
1.这段代码是我自己设计的用来传输文件的,发送文件之前会有一个固定长度的结构体发送给接收端,包含文件大小,文件名等,接收端通过判断结构里的信息反馈给发送端该文件是不存在还是已存在还是已接收一部分需要续传等,然后发送端根据情况循环发送,接收端根据需要接收的大小循环接收,接收完成后会有一个确认符反馈给发送端。就是这个简单的逻辑。
2.我的这段程序没有涉及到应用层的任何协议,就是单纯的TCP\IP传输。连接服务器,发送文件,断开连接。我调试的时候,将send每次发送成功的数据都写入了一个缓存文件中,等到发送完成后,观察这个缓存文件的二进制和原文件是一样的,但是就是接收端收到的就是要出错,还偏偏都是32个字节的错,上图列出来的只是某一次损坏截取到的错误的32字节流(实际情况是每次收到的错误的32个字节并都不是这写数据,还有别的一些),我观察是http的包头信息的一部分,关键是我这个程序中根本没有用到http协议啊。我再跟您说一下运行情况,我在公司里试验过几十次了,找的都是不同的文件,传过去以后没有一次是损坏的 ,然后我在家里试的时候,不定时的就会出现这样的问题,文件会有32个字节的错误。我也不敢轻易怀疑是驱动或者协议的问题,因为我是实在没办法了。实在找不到问题了,没有调用上层的应用层协议,怎么会就给我出来了这么一段数据了呢。我的qq是641709408 您空闲的时候 可不可以加下我 我们来共同探讨一下呢?谢谢
temp1=recv(sock1,recvBuf,SENDBUF,0);
if (temp1>0)
{
out.Write(recvBuf,temp1);
}SENDBUF的值是?
但从代码逻辑看, 好像又没有问题. 去翻看了下我古老的代码库, 这个地方的定义的大小才1024, 而不是4096. 你可以尝试修改下这个值再测试.
这个是非常常见又隐蔽的一种BUG. 这个会影响第一次的通讯确认过程. 结构体内容可能因此不同步.2. 在接收开始前确认要获取的文件大小是否有问题,
write也有可能出现得到长度和写入结果不一致的情况, 应该加以判断.
如果是DLL, 那就花点时间, 改造成EXE, 或做个外部的LOADER, 用F11来进入DLL调试.