用SOCKET怎么得到邮件列表和信件的内容??

zhi_chong 2004-04-30 02:01:13
先贴代码:
#include <winsock2.h>
#include <string.h>
#include <stdlib.h>
#include <stdio.h>

int main()
{
int res;
char szServer[128] = "pop.163.com";
char szName[128] = "USER xxxxxxx\r\n";
char szPass[128] = "PASS xxxxxxx\r\n";
char szBuffer[1024];

WSADATA wsd;
SOCKET sClient;
sockaddr_in server;
hostent* host = NULL;

WSAStartup(MAKEWORD(2,2), &wsd);

sClient = socket(AF_INET, SOCK_STREAM, 0);

server.sin_family = AF_INET;
server.sin_port = htons(110);

host = gethostbyname(szServer);
if (host == NULL)
{
printf("Unable to resolve server\r\n");
return 1;
}
CopyMemory(&server.sin_addr, host->h_addr_list[0], host->h_length);
//connect
connect(sClient, (struct sockaddr *)&server, sizeof(server));
res = recv(sClient, szBuffer, sizeof(szBuffer), 0);
szBuffer[res] = '\0';
printf("%s\n",szBuffer);
//enter name
send(sClient, szName, strlen(szName), 0);
res = recv(sClient, szBuffer, sizeof(szBuffer), 0);
szBuffer[res] = '\0';
printf("%s\n",szBuffer);
//enter password
send(sClient, szPass, strlen(szPass), 0);
res = recv(sClient, szBuffer, sizeof(szBuffer), 0);
szBuffer[res] = '\0';
printf("%s\n",szBuffer);

send(sClient, "LIST\r\n", 6, 0);//这里出问题- -
res = recv(sClient, szBuffer, sizeof(szBuffer), 0);
szBuffer[res] = '\0';
printf("%s\n",szBuffer);

closesocket(sClient);
WSACleanup();

return 0;
}

SOCKET调用默认全部调用成功,所以就没有写发生错误的代码。
问题出现在
send(sClient, "LIST\r\n", 6, 0);//这里出问题- -
res = recv(sClient, szBuffer, sizeof(szBuffer), 0);
运行的时候总是不能返回完整的列表,只能返回第一行,但是用DEBUG单步调试的时候又完全正常,可以返回正确的邮件列表。
请问这是怎么回事?要怎么解决,想了一个晚上,还是没想到答案。。。。

如果把send(sClient, "LIST\r\n", 6, 0);
改成 send(sClient, "RETR 1\r\n", 8, 0);
不能完整的收到信件的内容。怎么解决啊
...全文
84 7 打赏 收藏 转发到动态 举报
写回复
用AI写文章
7 条回复
切换为时间正序
请发表友善的回复…
发表回复
CNPolaris 2004-05-12
  • 打赏
  • 举报
回复
邮件正文怎么取得呢???
zhi_chong 2004-05-02
  • 打赏
  • 举报
回复
没人愿意回答吗?
zhi_chong 2004-05-01
  • 打赏
  • 举报
回复
TO craks,我说的话是对 zfive5(醉马Ⅴ) 说的
RECV是没有收全,但是要如何解决?
如果我改成
while(1)
{
res = recv(sClient, szBuffer, sizeof(szBuffer), 0);

szBuffer[res] = '\0';
printf("%s\n",szBuffer);
}
就可以收到全部信息,但是跳不出这个循环,只通过res的值似乎不能判断什么时候跳出循环。

而且并没有解决我的疑问,用LIST的时候为什么单步调试就可以得到完整列表,但是运行的时候就只能得到第一行?
zhi_chong 2004-05-01
  • 打赏
  • 举报
回复
楼上的,不明白你的意思
craks 2004-05-01
  • 打赏
  • 举报
回复
可能是recv没有收全,你去判断一下他的返回值
醉马不肖 2004-05-01
  • 打赏
  • 举报
回复
LIST 1\r\n

RETR 1\r\n
zhi_chong 2004-04-30
  • 打赏
  • 举报
回复
自己的问题自己顶下

18,356

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC 网络编程
c++c语言开发语言 技术论坛(原bbs)
社区管理员
  • 网络编程
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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