tcp socket连接后接收不到返回的数据
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了tcp socket连接后接收不到返回的数据相关的知识,希望对你有一定的参考价值。
我想写一个邮件接收程序,无奈连接后接收不到数据,请问哪里出了问题?
或者谁曾经写过类似的程序给我参考一下
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(linelength == -1) socket->disconnect(); return false;
if(buf[0] != '+' | buf[1] != 'O' | buf[2] != 'K')
socket->disconnect();
return false;
if(i == -1)
getMailState(buf, mailTotal, boxsize);
i++;
if(i > 0)
QString u = getUid(buf);
if(namelist.indexOf(u) != -1)
socket->disconnect();
return true;
str = "RETR ";
sendStr(str+i);
str = getAll();
mailanalyze = new mailAnalyze(str);
mailanalyze->load();
if(i == mailTotal)
socket->disconnect();
return true;
socket->disconnect();
看见CXG_Command 的回答了,但是,我还是不懂,我哪里作的不对么? 我连接到邮箱地址,然后不应该发送命令登录么?难道邮箱服务器那端不应该返回信息给我么,
我是读取不到返回的信息,比如说“+OK”,现在是我根本连这个信息都读取不到,更不用说读取文件的内容了。。
发:smtp
收:pop3 一般的收件协议,它是直接把服务器上的信移动到客户端
收:imap 这个是VIP邮箱协议,它是把服务器上的信复制到客户端,有备分的
其次,使用POP3协议来从服务器读取数据,首先以只读方式打开收件箱,从服务器获取邮件列表,如果使用者选择列表中的邮件进行存放至本地操作,那么先获取该邮件的发送邮件地址,获取主题,获取信息(正文),接收附件,一一保存之后进行显示。
这样才可以正确从服务器上下载邮件~~
代码我就不提供了,网上应该到处都是,实在不懂就查查资料
一句老话,知己知彼方能百战不殆!
你先去了解下基于POP3,SMTP这类的邮件服务器运行机制吧!~
http://download.csdn.net/source/342433
VC写的邮件收发代码,认真读读 参考技术A 你是说send()函数所能接受的缓冲区最大是266K吗?
你反复增大buf缓冲的大小,直至1000000,你确定能成功地申请到这么大的缓冲区吗?我想是因为你在分配很大的内存空间做缓冲区时发生了失败,然而你又没考虑到这种失败的情况,以至于send()发送时使用了无权使用的内存,导致内存出错。
另外,TCP是可靠数据传输的协议,当你在一端使用send()发送出去数据时,必须等到接收端有反应才能返回(或者是发送超时失败),也就是说除非你使用2.2版本(有些人也叫4.0版本)的Socket并设置了超时,send()在一定程度上是阻塞的。而你所说的“协议还未传送数据send函数就已经往发送缓冲区copy了266k,直道超过266k就出错了”我就不太理解了。
希望你把你的意思表达清楚,以便大家能够帮助你。
//@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
你在申请很大的内存空间之后最好能确定下是否成功申请到了.在此基础上请你再试试2.2版本的Socket.TCP下的send绝对是阻塞的,TCP是可靠数据传输协议,这一点不会还有疑问吧. 参考技术B gggg
socket tcp/ip 之简单ssh协议
看了python核心编程和大牛的视频之后,自己动手也试了一试,写写笔记,加深一下印象
首先服务端要导入socket模块,然后绑定地址和端口,并监听,然后进入等待接收来自客户端请求的一个循环,如果有数据来连接,则接收数据,整理后把请求的数据发给客户端。
客户端则也是导入socket模块,连接地址和端口,然后是一个发送请求的循环,然后接收来自服务器的信息。
所有的数据的发送与接收都是采用字节类型,而不是字符串,所以要用encode编码。
实现计算机内部命令的接收与发送,如果输入的命令有误,则给出提示。
服务器端:
import socket, os #导入模块 tcp_ser = socket.socket() tcp_ser.bind((\'localhost\', 6666))#绑定端口和IP tcp_ser.listen(5)#监听数目 while True:#大循环,客户端挂掉服务端一直监听状态 conn, addr = tcp_ser.accept()#等待连接 print(\'waitting connect...\', addr) while True:#小循环,一个客户端的多个请求 data = conn.recv(1024)#允许一次接收的数据为1K #if not data:#在客户端已经判断,可以不要 # conn.send(b\'please input command!\') # continue cmd_data = os.popen(data.decode(\'utf-8\')).read()#调取读取计算机内部命令 if not cmd_data:#做个判断,如果读取为空,即没有返回信息,则输入命令有误,则发送特定信息,并重新请求 conn.send(b\'No command!\') continue conn.send(cmd_data.encode(\'utf-8\'))#如果命令正确则发送返回的数据 #conn.close() tcp_ser.close()
客户端:
import socket tcp_client = socket.socket() tcp_client.connect((\'localhost\', 6666))#客户端应该与服务器端一致 while True:#客户端的循环 data = input(\'>>\')#判断输入是否为空,若为空则不允许发送 if len(data) == 0: print(\'No input message...\') continue tcp_client.send(data.encode(\'utf-8\'))#发送请求数据 cmd_msg = tcp_client.recv(102400)#接收返回数据,一次性接收102k print(cmd_msg.decode(\'utf-8\'))#接收和发送都是以字节的形式,所以要编码encode,打印需要解码decode tcp_client.close()
成功实现:
以上是关于tcp socket连接后接收不到返回的数据的主要内容,如果未能解决你的问题,请参考以下文章
Java TCP/IP Socket深入剖析socket——TCP套接字的生命周期