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连接后接收不到返回的数据的主要内容,如果未能解决你的问题,请参考以下文章

socket入门分析

TCP/IP学习

63 网络编程——TCP编程

Java TCP/IP Socket深入剖析socket——TCP套接字的生命周期

Erlang 建立TCP连接后,怎么样从返回的Socket获取客户端ip和端口

简述Socket,IP,TCP三次握手,HTTP协议(有助于理解记忆和学习)