各位大侠,救救小弟,写了下面这段邮件群发后,邮件发到50多封,程序就down掉了,问题不明!!100分求救!!!
#include <afxwin.h>
#include <afx.h>
#include <afxdb.h>
#include <stdio.h>
#include <winsock.h>void sendmail(SOCKET sock,LPCTSTR mail_str,LPCTSTR mail_content)
{
char strResponse[255];
char strCommand[255]; char from[100]="[email protected]";
char *to; to=(LPSTR)mail_str;

strcpy(strCommand, "HELO localhost\r\n");
send(sock, strCommand, lstrlen(strCommand), 0);
if(recv(sock, strResponse, lstrlen(strResponse), 0) == SOCKET_ERROR)
{
printf("Failed to connect!Check it out[HELO] !!\n");
send(sock,"QUIT\r\n",7,0);
return;
}
//printf("%s\n",strResponse); strcpy(strCommand, "MAIL FROM:<");
strcat(strCommand, from);
strcat(strCommand,">\r\n");
send(sock, strCommand, lstrlen(strCommand), 0);
if(recv(sock, strResponse, lstrlen(strResponse), 0) == SOCKET_ERROR)
{
printf("Failed to connect!Check it out[FROM] !!\n");
send(sock,"QUIT\r\n",7,0);
return;
}
//printf("%s\n",strResponse); strcpy(strCommand, "RCPT TO:<");
strcat(strCommand, to);
strcat(strCommand,">\r\n");
send(sock, strCommand, lstrlen(strCommand), 0);
if(recv(sock, strResponse, lstrlen(strResponse), 0) == SOCKET_ERROR)
{
printf("Failed to connect!Check it out[TO] !!\n");
send(sock,"QUIT\r\n",7,0);
return;
}
//printf("%s\n",strResponse); strcpy(strCommand, "DATA\r\n");
send(sock, strCommand, lstrlen(strCommand), 0);
if(recv(sock, strResponse, lstrlen(strResponse), 0) == SOCKET_ERROR)
{
printf("Failed to connect!Check it out[DATA] !!\n");
send(sock,"QUIT\r\n",7,0);
return;
}
//printf("%s\n",strResponse); send(sock, mail_content, strlen(mail_content), 0);
if(recv(sock, strResponse, lstrlen(strResponse), 0) == SOCKET_ERROR)
{
printf("Failed to connect!Check it out[Content] !!\n");
send(sock,"QUIT\r\n",7,0);
return;
}
//printf("%s\n",strResponse); strcpy(strCommand,"\r\n.\r\n");
send(sock, strCommand, lstrlen(strCommand), 0);
if(recv(sock, strResponse, lstrlen(strResponse), 0) == SOCKET_ERROR)
{
printf("Failed to connect!Check it out !!\n");
send(sock,"QUIT\r\n",7,0);
return;
}
//printf("%s\n",strResponse); strcpy(strCommand, "QUIT\r\n");
send(sock, strCommand, lstrlen(strCommand), 0);
if(recv(sock, strResponse, lstrlen(strResponse), 0) == SOCKET_ERROR)
{
printf("Failed to connect!Check it out[QUIT] !!\n");
send(sock,"QUIT\r\n",7,0);
return;
}
//printf("%s\n",strResponse); printf("[Success] %s\n",to);
}void main()
{
CFile file;
CFileException ex;
char content[20000];
int cnt;
for(cnt=0;cnt<lstrlen(content);cnt++)
{
content[cnt] = ' '; 
} if(!file.Open("C:\\index.htm",CFile::modeRead,&ex))
{
TCHAR szError[1024];
        ex.GetErrorMessage(szError, 1024);
        printf("%s\n",szError);
file.Close();
        return;
}
UINT Byte=file.Read(content,lstrlen(content));
file.Close();

char con_str[200];
char dbname[100];
char user[100];
char password[100];
CDatabase *Conn; strcpy(dbname,"mail");
strcpy(user,"zsl");
strcpy(password,"2000"); sprintf(con_str,"DSN=%s;UID=%s;PWD=%s",dbname,user,password);
Conn=new CDatabase();
try
{
Conn->OpenEx(con_str,CDatabase::noOdbcDialog);
printf("[Success] ODBC have been connected!!\n");
}
catch(CDBException * e)
{
printf("Error is %s",e->m_strError);
} CRecordset Rs(Conn);
Rs.Open(CRecordset::forwardOnly, _T("SELECT mail FROM chr_log"));
CString mail;
while(!Rs.IsEOF())
{
SOCKET sock;
struct sockaddr_in sin; WSADATA wsadata;
WORD vVersionRequested; vVersionRequested = MAKEWORD(2, 0); if(WSAStartup(vVersionRequested, &wsadata))
{
printf("Socket Loading failed !Check it out !");
return;
} if((sock = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP)) == INVALID_SOCKET)
{
printf("Socket Create failed! Check it out !");
return;
} sin.sin_addr.s_addr = inet_addr("127.0.0.1");
sin.sin_family = AF_INET;
sin.sin_port = htons(25);

if(connect(sock, (sockaddr *)&sin, sizeof(sockaddr)) == SOCKET_ERROR)
{
closesocket(sock);
printf("Failed to connect !Retry!!");
return;
}
Rs.GetFieldValue(short(0),mail);
printf("Mail is:%s\n",mail);
sendmail(sock, (LPCTSTR)mail, content);
closesocket(sock);
Rs.MoveNext();
}
Rs.Close();
Conn->Close();
return;
}

解决方案 »

  1.   

    你自己不会用DEBUG看看哪个地方出问题了?
    看看有没有内存泄露什么的,
      

  2.   

    我对VC的IDE的使用不是很熟,debug的过程中我从watch中看不出任何对我有所帮助的信息,真是脸红阿,想请各位高手帮我分析一下,希望大家给我这个菜鸟点帮助,好吗?先谢谢楼上对我教诲!:)
      

  3.   

    我把程序拿下来,改了一下。
    虽然不是从数据库里读取信息。但单步执行,发一个mail是没错的。有可能是服务器把你给禁止了,你短时间内发的邮件太多了。
      

  4.   

    谢谢楼上各位的关注,可是我是用的自己本机架设的SMTP虚拟服务器阿,没有被封掉的理由阿,但是在Debug状态下会在发送content的时候,recv函数那一步down掉,不过是偶然现象,所以很有可能在发的多的时候,就会在这一步停下,不知道recv函数有什么要注意的事情阿?请各位高手帮帮我吧,我真的是为之已经肝脑涂地了。本以为是内存泄漏可是现在改了,还是不行,不知道为什么,郁闷~~
      

  5.   

    后又修改后,还是差不多的情形,请各位帮忙看看,到底是什么问题呢?
    #include <afxwin.h>
    #include <afx.h>
    #include <afxdb.h>
    #include <stdio.h>
    #include <memory.h>
    #include <winsock.h>void sendmail(SOCKET sock,LPCTSTR mail_str,LPCTSTR mail_content)
    {
    char strResponse[200];
    char strCommand[200];
    memset(strResponse,' ',sizeof(strResponse));
    memset(strCommand,' ',sizeof(strCommand)); char *to; to=(LPSTR)mail_str;

    sprintf(strCommand, "HELO localhost\r\n");
    send(sock, strCommand, lstrlen(strCommand), 0);
    if(recv(sock, strResponse, lstrlen(strResponse), 0) == SOCKET_ERROR)
    {
    printf("Failed to connect!Check it out[HELO] !!\n");
    send(sock,"QUIT\r\n",7,0);
    return;
    }
    //printf("%s\n",strResponse); memset(strResponse,' ',sizeof(strResponse));
    memset(strCommand,' ',sizeof(strCommand)); sprintf(strCommand, "MAIL FROM:<[email protected]>\r\n");
    send(sock, strCommand, lstrlen(strCommand), 0);
    if(recv(sock, strResponse, lstrlen(strResponse), 0) == SOCKET_ERROR)
    {
    printf("Failed to connect!Check it out[FROM] !!\n");
    send(sock,"QUIT\r\n",7,0);
    return;
    }
    //printf("%s\n",strResponse); memset(strResponse,' ',sizeof(strResponse));
    memset(strCommand,' ',sizeof(strCommand)); sprintf(strCommand, "RCPT TO:<%s>\r\n",to);
    send(sock, strCommand, lstrlen(strCommand), 0);
    if(recv(sock, strResponse, lstrlen(strResponse), 0) == SOCKET_ERROR)
    {
    printf("Failed to connect!Check it out[TO] !!\n");
    send(sock,"QUIT\r\n",7,0);
    return;
    }
    //printf("%s\n",strResponse); memset(strResponse,' ',sizeof(strResponse));
    memset(strCommand,' ',sizeof(strCommand)); sprintf(strCommand, "DATA\r\n");
    send(sock, strCommand, lstrlen(strCommand), 0);
    if(recv(sock, strResponse, lstrlen(strResponse), 0) == SOCKET_ERROR)
    {
    printf("Failed to connect!Check it out[DATA] !!\n");
    send(sock,"QUIT\r\n",7,0);
    return;
    }
    //printf("%s\n",strResponse); memset(strResponse,' ',sizeof(strResponse));
    memset(strCommand,' ',sizeof(strCommand)); send(sock, mail_content, strlen(mail_content), 0);
    if(recv(sock, strResponse, lstrlen(strResponse), 0) == SOCKET_ERROR)
    {
    printf("Failed to connect!Check it out[Content] !!\n");
    send(sock,"QUIT\r\n",7,0);
    return;
    }
    //printf("%s\n",strResponse); memset(strResponse,' ',sizeof(strResponse));
    memset(strCommand,' ',sizeof(strCommand)); sprintf(strCommand,"\r\n.\r\n");
    send(sock, strCommand, lstrlen(strCommand), 0);
    if(recv(sock, strResponse, lstrlen(strResponse), 0) == SOCKET_ERROR)
    {
    printf("Failed to connect!Check it out !!\n");
    send(sock,"QUIT\r\n",7,0);
    return;
    }
    //printf("%s\n",strResponse); memset(strResponse,' ',sizeof(strResponse));
    memset(strCommand,' ',sizeof(strCommand)); sprintf(strCommand, "QUIT\r\n");
    send(sock, strCommand, lstrlen(strCommand), 0);
    if(recv(sock, strResponse, lstrlen(strResponse), 0) == SOCKET_ERROR)
    {
    printf("Failed to connect!Check it out[QUIT] !!\n");
    send(sock,"QUIT\r\n",7,0);
    return;
    }
    //printf("%s\n",strResponse); printf("[Success] %s\n",to);
    }void main()
    {
    CFile file;
    CFileException ex;
    char content[20000];
    memset(content,' ',sizeof(content)); if(!file.Open("C:\\index.htm",CFile::modeRead,&ex))
    {
    TCHAR szError[1024];
            ex.GetErrorMessage(szError, 1024);
            printf("%s\n",szError);
    file.Close();
            return;
    }
    UINT Byte=file.Read(content,lstrlen(content));
    file.Close();

    char con_str[200];
    char dbname[100];
    char user[100];
    char password[100];
    CDatabase *Conn; strcpy(dbname,"mail");
    strcpy(user,"zsl");
    strcpy(password,"2000"); sprintf(con_str,"DSN=%s;UID=%s;PWD=%s",dbname,user,password);
    Conn=new CDatabase();
    try
    {
    Conn->OpenEx(con_str,CDatabase::noOdbcDialog);
    printf("[Success] ODBC have been connected!!\n");
    }
    catch(CDBException * e)
    {
    printf("Error is %s",e->m_strError);
    } CRecordset Rs(Conn);
    Rs.Open(CRecordset::forwardOnly, _T("SELECT email FROM chr_log"));
    CString mail;
    while(!Rs.IsEOF())
    {
    SOCKET sock;
    struct sockaddr_in sin; WSADATA wsadata;
    WORD vVersionRequested; vVersionRequested = MAKEWORD(2, 0); if(WSAStartup(vVersionRequested, &wsadata))
    {
    printf("Socket Loading failed !Check it out !");
    return;
    } if((sock = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP)) == INVALID_SOCKET)
    {
    printf("Socket Create failed! Check it out !");
    return;
    } sin.sin_addr.s_addr = inet_addr("127.0.0.1");
    sin.sin_family = AF_INET;
    sin.sin_port = htons(25);

    if(connect(sock, (sockaddr *)&sin, sizeof(sockaddr)) == SOCKET_ERROR)
    {
    closesocket(sock);
    printf("Failed to connect !Retry!!");
    return;
    }
    Rs.GetFieldValue(short(0),mail);
    printf("Mail is:%s\n",mail);
    sendmail(sock, (LPCTSTR)mail, content);
    closesocket(sock);
    Rs.MoveNext();
    }
    Rs.Close();
    Conn->Close();
    return;
    }
      

  6.   

    strResponse,
    strCommand
    缓冲区短了。越界造成
      

  7.   

    楼上的大侠,我现在把strResponse设置成了1000000,现在能发很多封了,但是还是无法完全发送成功,不知哪位高手再帮忙找找问题,或者教授我如何来追踪这种异常。谢谢楼上的帮忙,让我看到了曙光!
      

  8.   

    就是说线程死掉了
    可能服务器SOKET没有响应造成你的SOCKET阻塞