免费注册 查看新帖 |

Chinaunix

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

socket 发送文件问题 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2008-10-25 13:55 |只看该作者 |倒序浏览
代码如下:
STATUS uploadFile(char *uploadUrl,int fileType)
{
    struct sockaddr_in        sin;
    int retval,sockfd;
    struct stat finfo;
    char *sServer;
    char *sPath;
    int nPort;
    long fileLength;

    fp = fopen( "./testfile","rb" );
    if (fp){
        fseek(fp,0,SEEK_END);
        fileLength = ftell(fp);
    }

    parseUrl(uploadUrl,&sServer,&nPort,&sPath);
    trace(INFO,"%s:%d: server is: %s, port is %d,path is %s\n",__FILE__,__LINE__,sServer,nPort,sPath);   
    setHttpUploadHeader(sPath,sServer,fileLength);
    trace(INFO,"%s:%d: http request is:\n %s\n",__FILE__,__LINE__,httpRequest);
   
    if ((sockfd=socket(AF_INET,SOCK_STREAM,0)) < 0){
         trace(INFO,"%s:%d: Socket error\n",__FILE__,__LINE__);
         return DP_ERROR;
    }

    bzero(&sin, sizeof(sin));
    sin.sin_family = AF_INET;
    sin.sin_port = htons(nPort);

    sin.sin_addr.s_addr = inet_addr(sServer);
    if (connect(sockfd,(struct sockaddr *)&sin,sizeof(sin))<0)
    {
        trace(ERROR,"%s:%d: Connect upload server error!\n",__FILE__,__LINE__);
        return DP_ERROR;
    }else{
        trace(ERROR,"%s:%d: Connect upload server OK!\n",__FILE__,__LINE__);
    }

    size_t r_len;
    rewind(fp);
    memset(buffer,0,BUFFER_SIZE);
    trace(INFO,"%s:%d: before while...\n",__FILE__,__LINE__);   
    while (!feof(fp))
    {
        r_len = fread(buffer,1,BUFFER_SIZE,fp);
        trace(INFO,"%s:%d: Enter while... r_len=%d\n",__FILE__,__LINE__,r_len);   
        write(sockfd,buffer,r_len);
    }

    close(sockfd);
    fclose(fp);
   
    return DP_OK;

}

代码执行后在服务器上没有找到文件,感觉自己还是没有搞清楚机制。
各位大侠帮忙看看!

[ 本帖最后由 garyli0314 于 2008-10-25 14:40 编辑 ]

论坛徽章:
0
2 [报告]
发表于 2008-10-25 14:10 |只看该作者
要求是: 根据一个url,上传一个特定文件到服务器端的指定位置。


在线等。。。。。。。。。。。

论坛徽章:
0
3 [报告]
发表于 2008-10-25 15:05 |只看该作者
这个自己调试一下就差不多了

论坛徽章:
0
4 [报告]
发表于 2008-10-25 15:21 |只看该作者
目前的问题是,不确定,给出的url是http server还是ftp server,
两者的实现方式,是否相同?
http server的话,是不是要根据http协议来构造包。
我抓了web 上传文件的包,发现里面有些东西不是很懂。
-----------------------------------------------------------
POST /bug_file_add.php HTTP/1.1

Accept: image/gif, image/x-xbitmap, image/jpeg, image/pjpeg, application/x-shockwave-flash, application/vnd.ms-excel, application/vnd.ms-powerpoint, application/msword, */*

Weferer: WCUFPEGAUTFJMVRESKPNKMBIPBARHDMN

Accept-Language: zh-cn

Content-Type: multipart/form-data; boundary=---------------------------7d835d295017a

Accept-Encoding: gzip, deflate

User-Agent: Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1; SV1; Maxthon; .NET CLR 2.0.50727)

Host: 172.16.8.19

Content-Length: 7295

Connection: Keep-Alive

Cache-Control: no-cache

Cookie: MANTIS_STRING_COOKIE=800c7ae1cf20fbf53be57edb857e230fb292ef7c329208520b5ade814987ac4a
-----------------------------7d835d295017a
Content-Disposition: form-data; name="bug_id"
7
-----------------------------7d835d295017a
Content-Disposition: form-data; name="max_file_size"
5000000
-----------------------------7d835d295017a

Content-Disposition: form-data; name="file"; filename="C:\Documents and Settings\Administrator\......\aa.c"

Content-Type: text/plain
-------------------------------------------------
问题:1. 其中的boundary生成?还是随便定义的?
      2.上面的http头,如果是二进制文件,content-type该如何定义?application/octet-stream?
      3. Content-Disposition: form-data; name="max_file_size"
             5000000
             是必须的吗?

论坛徽章:
0
5 [报告]
发表于 2008-10-25 17:22 |只看该作者
php上传应该是由服务端配置的php_module来根据http协议来处理你这个上传请求,apache和浏览器建立tcp连接,根据http协议接收post过来的文件数据。

现在你要自己用socket连apache传文件,这时候不考虑apache加载其它module的情况,首先你要遵循http协议post数据,其次你要自己写个module处理这些数据。
需要一个module来实现php 模块中接收文件的功能。

论坛徽章:
0
6 [报告]
发表于 2008-10-27 13:24 |只看该作者
谢谢几位的回复,我现在已经大致明白了其中的原理。我已经拼凑出了下面的http头,可以被服务端正常接受了。

POST / HTTP/1.1
Accept:*/*
Accept-Encoding: gzip,deflate
User-Agent: Mozilla/4.0 (compatible; MSIE 5.01; Windows NT 5.0)
Host:172.16.8.188
Content-Length: 1132
Content-Type: application/octet-stream; boundary=---6563
Connection: Keep-Alive

---6563
Content-Disposition: form-data; name="file"; filename="./dwfile"
Content-Type: application/octet-stream

可惜我现在用的那个apache的web server会重定向我的请求到登陆页面(是个应用系统,可以支持upload文件)。
看来我要找一个可以不用认证来upload文件的http server测试一下。
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP