嵌入式下邮件发送

来源:互联网 发布:java 接口初始化 编辑:程序博客网 时间:2024/05/19 20:49

      在采用socket实现嵌入式下邮件发送的功能时,由于网络的原因会出现登录邮件服务器失败的情况,此种情况如果socket采用阻塞模式就会导致程序卡在connect函数中出不来。我采用的解决方法是在connect时将socket设置为非阻塞模式,设置10s的超时,然后再将socket设置为非阻塞模式。

      具体的代码片段如下:


//获得域名地址
static char *GetIp(char *dn_or_ip)
{     
    struct sockaddr_in addr;
    struct hostent *host;
    struct ifreq req;
    int sock;
    if (dn_or_ip == NULL) return NULL;
    if (strcmp(dn_or_ip, "localhost") == 0)
    {
        sock = socket(AF_INET, SOCK_DGRAM, 0);
        strncpy(req.ifr_name, "eth0", IFNAMSIZ);
        if ( ioctl(sock, SIOCGIFADDR, &req) < 0 )
        {
            DBG_PRINT(("ioctl error: %s\n", strerror (errno)));
            return NULL;
        }
        dn_or_ip = (char *)inet_ntoa(*(struct in_addr *) &((struct sockaddr_in *) &req.ifr_addr)->sin_addr);
        shutdown(sock, 2);
        close(sock);
    }
    else
    {                
        host = gethostbyname(dn_or_ip);                
        if (host == NULL) return NULL;                
        dn_or_ip = (char *)inet_ntoa(*(struct in_addr *)(host->h_addr));
    }  
    return dn_or_ip;
}

 

 int opt;
 int nSendBuf=500;
 m_nfd = socket(AF_INET,SOCK_STREAM,0);
 if(m_nfd == SOCKET_ERROR)
 {
  printf("socket init error/n");
  shutdown(m_nfd,SD_BOTH);
  close(m_nfd);
  return 0;
 }

 opt = SO_REUSEADDR;
 setsockopt(m_nfd, SOL_SOCKET, SO_REUSEADDR, &opt, sizeof(opt));
 setsockopt(m_nfd,SOL_SOCKET,SO_SNDBUF,(const char*)&nSendBuf,sizeof(int));

 

 

int flags = fcntl(m_nfd,F_GETFL,0);
 fcntl(m_nfd,F_SETFL,flags|O_NONBLOCK);

 //入参检查
 if ((szHost == NULL) || (*szHost == '/0'))
 {
  return 0;
 }
    hostip = GetIp(const_cast<char*>(szHost));
 if(hostip == NULL)
 {
  return 0;
 }
 memset(&m_RemoteSockAddr,0,sizeof(struct sockaddr));
 m_RemoteSockAddr.sin_family = AF_INET;
 m_RemoteSockAddr.sin_port   = htons(m_nPort);
 m_RemoteSockAddr.sin_addr.s_addr = inet_addr(hostip);
 
 m_nResult =  connect(m_nfd,(struct sockaddr *)&m_RemoteSockAddr,sizeof(struct sockaddr));
 if( m_nResult < 0 && errno != EINPROGRESS)
 {
  printf("connect erro:%d/n",errno);
  shutdown(m_nfd,SD_BOTH);
  close(m_nfd);
  return 0;
 }

 fd_set sendSeT;
 FD_ZERO(&sendSeT);
 FD_SET(m_nfd,&sendSeT);

 timeval timeout;
 timeout.tv_sec= 10;
 timeout.tv_usec= 0;
 m_nResult= select(m_nfd+1,0,&sendSeT,0,&timeout);

 if((SOCKET_ERROR==m_nResult)||!m_nResult)
 {
  printf("connect erro:%d/n",errno);
  shutdown(m_nfd,SD_BOTH);
  close(m_nfd);
  return 0;
  
 }

 printf("connect Mail Host success!!!!/n");
 
 fcntl(m_nfd, F_SETFL, flags);