邮件接收程序,为什么收到的数据有时候是乱码?
代码:
#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
收到的数据中英文是对的,但中文是乱码,不知道为什么?求救!