解决方案 »
- 想学vc/mfc,有几个问题向前辈们请教
- 在多线程调用的动态库下,TCP服务器如何得到客户端连接消息???
- VC工具使用问题 Resource View -〉Resource Includes... Compile-time directives使用来干嘛的?
- CAsyncSocket::Receive(lpBuf, nBufLen, nFlags)) 执行时间的问题?
- 有无办法把一个窗口设为topmost窗口,同时其他的应用程序不会失去输入焦点
- 如何给对话框架最小化按钮?
- 我用installshield6.22,我在程序中使用ole调用excel,还有mscomm控件,我该添加那些文件?
- 为什么我在CView::OnDraw中写了代码,而程序运行的时候却不执行这个函数??
- 请问如何用virtualalloc建立一个动态数组?
- edit控件子类化 实现接受拖拽文本的问题
- 如何指定Release模式下的UNICODE模式
- 一个关于SCardGetStatusChange 的问题
这个问题的本质我看是这样,recv返回的数字是不是一定就是表示接收到多少字节数据?会不会出现说实际已经没有数据了,但recv还会返回大于0的情况?或者实际读了1024字节数据,但返回值是1500
是不是servlet自身的传输协议有标记文件结束的数据包被你误认为是文件的一部分了
我做过测试,服务器那边不设置Content-Length,也就是说,下载的时候不知道文件大小,我用IE、chrome都能正常下载,长度正常,为什么我就不行呢?很郁闷啊
你用浏览器下载,它会自动识别头,并且不会保存此头信息,所以正确,用recv只是把原始的信息读出来。正常现象,用recv接受http协议的文件时,去掉协议头即可
WSADATA wsaData;
int err;wVersionRequested = MAKEWORD(2, 2);
err = WSAStartup(wVersionRequested, &wsaData);
if (err != 0)
{
return 0;
}
SOCKET s = NULL;
sockaddr_in sa;
::memset(&sa, 0, sizeof(sockaddr));
s = ::socket(PF_INET, SOCK_STREAM, IPPROTO_TCP);
if (s == INVALID_SOCKET)
{
::MessageBox(hWnd, "创建socket失败", "", MB_OK);
}
sa.sin_family = PF_INET;
sa.sin_addr.S_un.S_addr = ::inet_addr("127.0.0.1");
sa.sin_port = ::ntohs(80);
err = connect(s, (sockaddr*)&sa, sizeof(sockaddr_in));
if (err == SOCKET_ERROR)
{
errorCode = WSAGetLastError();
::MessageBox(hWnd, "socket连接失败", "", MB_OK);
}// 发http报头
::send(s, buffer, length, 0);// 接收http报头,可以从Content-Length里得到长度,测试中这里是正常的
...// 出现空白行后就是文件数据了
int r = 0;
DWORD length = 0;
while ((r = ::recv(s, buffer, 51200, 0)) > 0) {
length += r;
}