邮件接收程序,为什么收到的数据有时候是乱码?

cjhacker 2006-11-23 02:38:00
代码:
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <time.h>
#include <winsock.h>

/* 全局变量 */
SOCKET sockfd;
struct sockaddr_in serveraddr;
char recvinfo[ 100000 ];
char sendinfo[ 30 ];

void initinterface( void )
{
char *logo[12]={"",
" \\\\\\|///",
" \\\\ - - //",
" ( @ @ )",
" ┏━━━━━━━━━oOOo-(_)-oOOo━┓",
" ┃ OutLook Killer V0.01 ┃",
" ┃ Made by cjhacker ┃",
" ┃ Oooo ┃",
" ┗━━━━━━━━━ oooO━-( )━┛",
" ( ) ) /",
" \\ ( (_/",
" \\_)",};
for ( int i = 1; i < 12; i++ )
{
printf("%s\n",logo[i]);
}
}


/* winsock 初始化函数 */
void initsocket( void )
{
WSADATA wsaData;
WORD wVersionRequested;
int err;
wVersionRequested = MAKEWORD( 1,1 );
err = WSAStartup( wVersionRequested, &wsaData );

if (err != 0)
{
printf( "函数初始化错误" );
exit( 1 );
}
}

/* 创建流式插口 */
void creatsocket( void )
{
if( ( sockfd = socket( AF_INET, SOCK_STREAM, 0 ) ) < 0 )
{
printf( "create socket error\n" );
exit( 1 );
}
}

/* 填写服务器地址结构 */
void fillserveraddr( void )
{

char server[30];
serveraddr.sin_family = AF_INET;
printf( "Server:" );
scanf( "%s", server );

struct hostent *hostent2;
hostent2=gethostbyname( server );

serveraddr.sin_addr.s_addr = inet_addr( inet_ntoa(*((in_addr*)*(hostent2->h_addr_list))) );
serveraddr.sin_port = htons( 110 );
}

/* 接收数据 */
void recvdata( void )
{
char buf_recv[ 10 ];
memset( recvinfo, 0, sizeof( recvinfo ) );
for( ; ; )
{
memset( buf_recv, 0, sizeof( buf_recv ) );
recv( sockfd, buf_recv, 1, 0);
strcat( recvinfo, buf_recv);
if ( strcmp( buf_recv, "\n") == 0 )
{
break;
}
}

}


/* 连接pop3服务器 */
void connectserver(void)
{
if ( connect( sockfd, (sockaddr *)&serveraddr, sizeof(serveraddr) ) < 0 )
{
printf("连接请求失败,错误号为%d",WSAGetLastError( ));
}
recvdata( ); //接收pop3服务器确认信息
printf( "%s", recvinfo );
}


/* 显示邮件 */
void list( )
{

int n = 0, num1, num2, num3;
num1 = num2 = num3 = 0;
char buf_recv[ 10 ];
memset( recvinfo, 0, sizeof( recvinfo ) );
send( sockfd, "list\r\n", strlen("list\r\n"), 0 );
for( ; ; )
{
memset( buf_recv, 0, sizeof( buf_recv ) );
n++;
recv( sockfd, buf_recv, 1, 0 );
strcat( recvinfo, buf_recv );
if( strcmp( buf_recv, "\." ) == 0 ) num1 = n; /* 若连续收到三个字符为..\r\n,则判断为结束 */
if( strcmp( buf_recv, "\r" ) == 0 ) num2 = n;
if( strcmp( buf_recv, "\n" ) == 0 ) num3 = n;
if( ( ( num3 - num2 ) == 1) && ( ( num2 - num1 ) == 1 ) ) break;

}
printf( "%s\n", recvinfo );
}

void retrmail( )
{
int n = 0, num1, num2, num3;
char buf_recv[ 100 ];
for( ; ; )
{
memset( recvinfo, 0, strlen(recvinfo) );
memset( sendinfo, 0, strlen(sendinfo) );

strcpy( sendinfo,"retr " );
printf( "Mail number:" );

scanf( "%s", &sendinfo[ 5 ] );
if ( sendinfo[5] == '0' ) break;

strcat(sendinfo,"\r\n");
send( sockfd, sendinfo, strlen( sendinfo ), 0 );
n = num1 = num2 = num3 = 0;
for( ; ; )
{
memset( buf_recv, 0, sizeof( buf_recv ) );
n++;
recv(sockfd,buf_recv,1,0);
strcat(recvinfo,buf_recv);
if( strcmp( buf_recv, "\." ) == 0 ) num1 = n;
if( strcmp( buf_recv, "\r" ) == 0 ) num2 = n;
if( strcmp( buf_recv, "\n" ) == 0 ) num3 = n;
if( ( ( num3-num2 ) == 1 ) && ( ( num2 - num1 ) == 1 ) ) break;
}
printf( "%s\n", recvinfo );
}
}



void main( )
{


initinterface( );

initsocket( );

creatsocket( );

fillserveraddr( );

connectserver();

//发送用户名
memset( sendinfo, 0, strlen( sendinfo ) );
strcpy( sendinfo,"user " );
printf( "Username:" );
scanf( "%s", &sendinfo[ 5 ] );
strcat( sendinfo, "\r\n" );
send( sockfd, sendinfo, strlen(sendinfo), 0 );
recvdata();
printf( "%s", recvinfo );

//发送密码
memset( sendinfo, 0, strlen( sendinfo ) );
strcpy( sendinfo, "pass " );
printf( "Password:" );
scanf( "%s", &sendinfo[ 5 ] );
strcat( sendinfo, "\r\n" );
send( sockfd, sendinfo, strlen(sendinfo), 0 );
recvdata();
printf( "%s", recvinfo );

//显示
list( );

//显示邮件
retrmail( );

}

测试pop3服务器:pop.sina.com.cn
用户名:pop3_test3
密码:123456
收到的数据中英文是对的,但中文是乱码,不知道为什么?求救!
...全文
335 13 打赏 收藏 转发到动态 举报
写回复
用AI写文章
13 条回复
切换为时间正序
请发表友善的回复…
发表回复
chary8088 2006-11-28
  • 打赏
  • 举报
回复
楼上正解
cjhacker 2006-11-24
  • 打赏
  • 举报
回复
我不进行编码转换。。。。。
我只想接受中文。。。。。。
doudouHuY 2006-11-24
  • 打赏
  • 举报
回复
通常用base64编解码,算法网上搜一下,也可以自己写一个
cjhacker 2006-11-24
  • 打赏
  • 举报
回复
lai ren a
owlling 2006-11-24
  • 打赏
  • 举报
回复
编码问题,首先接受纯文本邮件(非utf-8)看看,
jianshi051 2006-11-24
  • 打赏
  • 举报
回复
看不懂哦

但是小人画得很有趣哦~
lovesnow1314 2006-11-24
  • 打赏
  • 举报
回复
你的recvinfo接收到的是utf-8编码后的中文,如果你想显示的话,必须进行codepage转换。
cjhacker 2006-11-24
  • 打赏
  • 举报
回复
估计大家都认为我没救了
cjhacker 2006-11-23
  • 打赏
  • 举报
回复
我不进行MIME编码的转换,只接收邮件原始代码就可以.
cjhacker 2006-11-23
  • 打赏
  • 举报
回复
但是我用pop.126.com测试就可以正确接收中文啊???
boot2006 2006-11-23
  • 打赏
  • 举报
回复
没有转化编码
shawnwan 2006-11-23
  • 打赏
  • 举报
回复
得进行编码的转换
jixingzhong 2006-11-23
  • 打赏
  • 举报
回复
编码 ~~

69,382

社区成员

发帖
与我相关
我的任务
社区描述
C语言相关问题讨论
社区管理员
  • C语言
  • 花神庙码农
  • 架构师李肯
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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