免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
查看: 1513 | 回复: 1
打印 上一主题 下一主题

求助:网上socket用c写的一个发邮件附件的程序,附件显示大小却不能下载,为什么? [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2006-06-11 17:54 |只看该作者 |倒序浏览
能登录到邮箱,发文本内容也行,发.txt的普通文本附件也行。jpg图片附件只能看到大小,下载下来却只有5字节,搞不懂是什么原因。
发附件源码如下:
int SendAffix(const char *filename,const int length)
{
        int  len;
        FILE *fp=NULL;       
    unsigned char datasrc[58],datades[100];       
        fp = fopen(filename,"rb";
        if(fp==NULL)
        {
                printf("can not open file";
                return -1;
        }
        send_data = "--zhangwei\r\n";
        rt = send(s,send_data,strlen(send_data),0);
        if(rt == SOCKET_ERROR)
        {
                printf("send error";
                shutdown(s,SD_BOTH);
                close(s);
                return -1;
        }
        sprintf(Filename,"Content-Type: application/octet-stream;name=%s\r\n",filename);
        rt = send(s,Filename,strlen(Filename),0);
        if(rt == SOCKET_ERROR)
        {
                printf("sendfilenameerror";
                shutdown(s,SD_BOTH);
                close(s);
                return -1;
        }               
        send_data = "Content-Transfer-Encoding: base64\r\n";
        rt = send(s,send_data,strlen(send_data),0);
        if(rt == SOCKET_ERROR)
        {
                printf("sendcodemethoderror";
                shutdown(s,SD_BOTH);
                close(s);
                return -1;
        }
        sprintf(attachname,"Content-Disposition: inline;filename=%s\r\n",filename);
        rt = send(s,attachname,strlen(attachname),0);
        if(rt == SOCKET_ERROR)
        {
                printf("sendfilenameerror";
                shutdown(s,SD_BOTH);
                close(s);
                return -1;
        }
        send_data = "\r\n";
        rt = send(s,send_data,strlen(send_data),0);
        if(rt == SOCKET_ERROR)
        {
                shutdown(s,SD_BOTH);
                close(s);
                return -1;
        }
        len = length;
        while(!feof(fp))
        {               
                if(len>=57)
                {
          fread(datasrc,57,1,fp);
                  datasrc[57]='\0';
                  len -= 57;
                }
                else if(len>0)
                {
                        fread(datasrc,len,1,fp);
                        datasrc[len]='\0';
                        len = 0;
                }
                else
                        break;
                Base64_Code((unsigned char *)datasrc,(unsigned char *)datades);
                for(int timedelay=0;timedelay<1000;timedelay++)
                      for(int timedelay1=0;timedelay1<1000;timedelay1++);               
        rt = send(s,(char *)datades,strlen((char *)datades),0);       
                if(rt == SOCKET_ERROR)
                {
                        printf("sendbase64dataerror";
                        shutdown(s,SD_BOTH);
                        close(s);
                        return -1;
                }
        }
        fclose(fp);
        send_data = "\r\n";
        rt = send(s,send_data,strlen(send_data),0);
        if(rt == SOCKET_ERROR)
        {
                shutdown(s,SD_BOTH);
                close(s);
                return -1;
        }
        return 1;
}
采用的base64编码函数如下:
int Base64_Code(unsigned char *s,unsigned char *d)
{
        char CharSet[64]=
        {
                'A','B','C','D','E','F','G','H',
                'I','J','K','L','M','N','O','P',
                'Q','R','S','T','U','V','W','X',
                'Y','Z','a','b','c','d','e','f',
                'g','h','i','j','k','l','m','n',
                'o','p','q','r','s','t','u','v',
                'w','x','y','z','0','1','2','3',
                '4','5','6','7','8','9','+','/'
        };
        unsigned char In[3];
        unsigned char Out[4];
        int cnt=0;
        if(!s||!d) return 0;
        for(;*s!=0
        {
                if(cnt+4>76)
                {
                        *d++='\n';
                        cnt=0;
                }
                if(strlen((char*)s)>=3)
                {
                        In[0]=*s;
                        In[1]=*(s+1);
                        In[2]=*(s+2);
                        Out[0]=In[0]>>2;
                        Out[1]=(In[0]&0x03)<<4|(In[1]&0xf0)>>4;
                        Out[2]=(In[1]&0x0f)<<2|(In[2]&0xc0)>>6;
                        Out[3]=In[2]&0x3f;
                        *d=CharSet[Out[0]];
                        *(d+1)=CharSet[Out[1]];
                        *(d+2)=CharSet[Out[2]];
                        *(d+3)=CharSet[Out[3]];
                        s+=3;
                        d+=4;
                }
                else if(strlen((char*)s)==1)
                {
                        In[0]=*s;
                        Out[0]=In[0]>>2;
                        Out[1]=(In[0]&0x03)<<4|0;
                        *d=CharSet[Out[0]];
                        *(d+1)=CharSet[Out[1]];
                        *(d+2)='=';
                        *(d+3)='=';
                        s+=1;
                        d+=4;
                }
                else if(strlen((char*)s)==2)
                {
                        In[0]=*s;
                        In[1]=*(s+1);
                        Out[0]=In[0]>>2;
                        Out[1]=(In[0]&0x03)<<4|(In[1]&0xf0)>>4;
                        Out[2]=(In[1]&0x0f)<<2|0;
                        *d=CharSet[Out[0]];
                        *(d+1)=CharSet[Out[1]];
                        *(d+2)=CharSet[Out[2]];
                        *(d+3)='=';
                        s+=2;
                        d+=4;
                }
                cnt+=4;
        }
        *d='\0';
        return 1;
}

论坛徽章:
0
2 [报告]
发表于 2006-06-14 12:14 |只看该作者
自己顶一个先。听人说,好像是编码有问题
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP