SOCKET 超时问题。。

Mycro 2005-05-09 04:42:08
我用select 设置了10秒接收超时,结果
确实10会超时;
但问题来了,我接受的数据很大,我每次接收 1024 bytes,
然后用循环,接受;


发现,很慢。。。

后来发现,循环里最后一次接收,数据时,偶尔会有10秒左右,

我猜这应该是发生了10秒的超时;而这个超时是我不想要的,
因为,没有数据了,就是接收完了;

请问大虾们,是怎么 解决的,有没有类似的,现成代码?

----------------------------------
备注,我的代码:
//接收超时设置
int rv = 0;

struct timeval outtime ; // 超时结构
FD_SET fdr = {1, PinSock};
outtime.tv_sec = m_TimeOut/1000;
outtime.tv_usec =0;

int rc = ::select(0, &fdr, NULL, NULL, &outtime);//检查可读状态

if(SOCKET_ERROR == rc)
{
int err = WSAGetLastError();
PinSock = NULL;
return -1;
}
if(rc == 0) //超时发生,无可读数据
{
m_sLastError += "\r\n\r\n********** 接收超时 **********\r\n\r\n";
int err = WSAGetLastError();
PinSock = NULL;
return -1;
}
else
{
//接收数据
rv = recv(PinSock,(char *)recvbuf, MAX_RECV_BUFFER,0);
if(rv == SOCKET_ERROR)
{
m_sLastError += "通讯错误:" + m_Msg;
}
}

//_debug
char buf[256];
memset(buf,0,256);

while(rv > 0)
{
nRvCount += rv;
if(rv < MAX_RECV_BUFFER)
{
memset(recvbuf + rv,0,MAX_RECV_BUFFER + 1 - rv);
}
pData += recvbuf;
rv = recv(PinSock,(char *)recvbuf, MAX_RECV_BUFFER,0);

}
...全文
263 6 打赏 收藏 转发到动态 举报
写回复
用AI写文章
6 条回复
切换为时间正序
请发表友善的回复…
发表回复
Mycro 2005-05-11
  • 打赏
  • 举报
回复
这个我知道,但我做的这个HTTP协议,不太一样,

是Email里的附件,可能是因为是64位编码,吧,它的头里没有文件长度。。

:(
jerry 2005-05-10
  • 打赏
  • 举报
回复
你的代码也没什么问题,其实这个不是超时不超时的问题, 而是怎么判断数据已经接收完毕的问题, 这个问题也就是通讯的两端怎么相互协调数据格式.

一般SOCKET 通讯都会首先指明数据长度或者数据有一个明确的结尾标志(保证数据中间不会出现这样的标志). 这样接收端就可以主动去判断什么时候接收已经完成,并决定是否断开连接.

使用超时来判断,1)效率问题. 2) 可靠性不好, 如果因为偶然的网络因素, 如数据堵塞,网络断开,而导致接收方超时.就会出现数据缺损的情况.

Mycro 2005-05-10
  • 打赏
  • 举报
回复
没人做过么?
jerry 2005-05-10
  • 打赏
  • 举报
回复
请问楼主是通过什么协议下载的? HTTP FTP都会向客户端发送文件长度呀
Mycro 2005-05-10
  • 打赏
  • 举报
回复
说得好,确实是这个问题,

但是,我有没有办法,判断,我要下载一个文件,

服务端,我控制不了。。
Mycro 2005-05-09
  • 打赏
  • 举报
回复
注意,我要SOCKET API 的,不要CSocket -- 不好用。。

16,551

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC相关问题讨论
社区管理员
  • 基础类社区
  • Creator Browser
  • encoderlee
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

        VC/MFC社区版块或许是CSDN最“古老”的版块了,记忆之中,与CSDN的年龄几乎差不多。随着时间的推移,MFC技术渐渐的偏离了开发主流,若干年之后的今天,当我们面对着微软的这个经典之笔,内心充满着敬意,那些曾经的记忆,可以说代表着二十年前曾经的辉煌……
        向经典致敬,或许是老一代程序员内心里面难以释怀的感受。互联网大行其道的今天,我们期待着MFC技术能够恢复其曾经的辉煌,或许这个期待会永远成为一种“梦想”,或许一切皆有可能……
        我们希望这个版块可以很好的适配Web时代,期待更好的互联网技术能够使得MFC技术框架得以重现活力,……

试试用AI创作助手写篇文章吧