tcp socket连接后接收不到返回的数据

来源:百度知道 编辑:UC知道 时间:2024/06/02 15:29:02
我想写一个邮件接收程序,无奈连接后接收不到数据,请问哪里出了问题?
或者谁曾经写过类似的程序给我参考一下

char buf[1024];
socket->connectToHost(“202.113.16.11”, 110);
if(!socket->waitForConnected())
{
return false;
}
socket->read(buf, sizeof(buf));
for(int i = -3; i <= mailTotal; i++)
{
QString str;
if(i == -3)
{
str = "USER ";
sendStr(str + mailinfo->getLoginName());
}
else if(i == -2)
{
str = "PASS ";
sendStr(str + mailinfo->getPassword());
}
else if(i == -1)
{
str = "STAT";
sendStr(str);
}
else if(i > 0)
{
str = "UIDL ";
sendStr(str + i);
}
qint64 linelength = socket->read(buf, sizeof(buf));
if(linele

你是说send()函数所能接受的缓冲区最大是266K吗?
你反复增大buf缓冲的大小,直至1000000,你确定能成功地申请到这么大的缓冲区吗?我想是因为你在分配很大的内存空间做缓冲区时发生了失败,然而你又没考虑到这种失败的情况,以至于send()发送时使用了无权使用的内存,导致内存出错。
另外,TCP是可靠数据传输的协议,当你在一端使用send()发送出去数据时,必须等到接收端有反应才能返回(或者是发送超时失败),也就是说除非你使用2.2版本(有些人也叫4.0版本)的Socket并设置了超时,send()在一定程度上是阻塞的。而你所说的“协议还未传送数据send函数就已经往发送缓冲区copy了266k,直道超过266k就出错了”我就不太理解了。

希望你把你的意思表达清楚,以便大家能够帮助你。
//@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
你在申请很大的内存空间之后最好能确定下是否成功申请到了.在此基础上请你再试试2.2版本的Socket.TCP下的send绝对是阻塞的,TCP是可靠数据传输协议,这一点不会还有疑问吧.

gggg

你搞清楚邮件收发协议
发:smtp

收:pop3 一般的收件协议,它是直接把服务器上的信移动到客户端

收:imap 这个是VIP邮箱协议,它是把服务器上的信复制到客户端,有备分的

其次,使用POP3协议来从服务器读取数据,首先以只读方式打开收件箱,从服务器获取邮件列表,如果使用者选择列表中的邮件进行存放至本地操作,那么先获取该邮件的发送邮件地址,获取主题,获取信息(正文),接收附件,一一保存之后进行显示。

这样才可以正确从服务器上下载邮件~~

代码我就不提供了,网上应该到处都是,实在不懂就查查资料

一句老话,知己知彼方能百战不殆!
你先去了解下基于POP3,SMTP这类的邮件服务器运行机制吧!~