| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 600 人关注过本帖
标题:SOCKET 接受到的文件总是少了一个字节
只看楼主 加入收藏
snnile2012
Rank: 1
等 级:新手上路
帖 子:9
专家分:4
注 册:2014-6-16
结帖率:66.67%
收藏
已结贴  问题点数:20 回复次数:7 
SOCKET 接受到的文件总是少了一个字节
今天写了一个SOCKET程序。
期望:向服务端(不用考虑实现)发起一个连接,并且向服务端发送一个XML文件,然后服务端返回一个XML文件。

大体上实现了上述功能。

但重点来了:
我接受到的XML文件总是少了一个字节。
今天下午抓包看了,服务端传过来的数据是完整的。

我的代码:
程序代码:
#include<netinet/in.h>
#include<sys/types.h>
#include<sys/socket.h>
#include<stdio.h>
#include<stdlib.h>
#include<string.h>

#define MYPORT 1029
#define BUFFERSIZE 1024

int main(int argc,char **argv)
{
    if(argc!=2)
    {
        printf("argc<2\n");
        exit(1);
    }

    struct sockaddr_in client_addr;
    bzero(&client_addr,sizeof(client_addr));
    client_addr.sin_family=AF_INET;
    client_addr.sin_addr.s_addr=htons(INADDR_ANY);
    client_addr.sin_port=htons(0);

    int client_socket=socket(AF_INET,SOCK_STREAM,0);
    
    if(client_socket<0)
    {
        printf("Create Socket Failed!\n");
        exit(1);
    }

    if(bind(client_socket,(struct sockaddr *)&client_addr,sizeof(client_addr)))
    {
        printf("Client Bind Port Failed!\n");
        exit(1);
    }

    struct sockaddr_in server_addr;
    bzero(&server_addr,sizeof(server_addr));
    server_addr.sin_family=AF_INET;
    if(inet_aton(argv[1],&server_addr.sin_addr)==0)
    {
        printf("Server IP Address Error!\n");
        exit(1);
    }
    
    server_addr.sin_port=htons(MYPORT);
    socklen_t server_addr_length=sizeof(server_addr);

    if(connect(client_socket,(struct sockaddr *)&server_addr,server_addr_length)<0)
    {
        printf("Can Not Connect To %s!\n",argv[1]);
        exit(1);
    }

    char buf[BUFFERSIZE];



    FILE *fp_1=fopen("send.xml","r");
    if(fp_1==NULL)
    {
        printf("File not found!\n");
    }
    else
    {
        bzero(buf,BUFFERSIZE);
        int file_block_length=0;
        while((file_block_length=fread(buf,sizeof(char),BUFFERSIZE,fp_1))>0)
        {
            printf("flie_block_length=%d\n",file_block_length);
            if(send(client_socket,buf,file_block_length,0)<0)
            {
                printf("Send file failed!\n");
                break;
            }
            bzero(buf,sizeof(buf));
        }
        fclose(fp_1);
        printf("Finished!\n");
    }



    FILE *fp=fopen("test.xml","w");
    if(fp==NULL)
    {
        printf("Can Not Open To Write!\n");
        exit(1);
    }

    bzero(buf,sizeof(buf));
    int length=0;
    while(length=recv(client_socket,buf,BUFFERSIZE,0))
    {
        if(length<0)
        {
            printf("Receive Data Failed!\n");
            break;
        }
        
        int write_length=fwrite(buf,sizeof(char),length,fp);
        if(write_length<length)
        {
            printf("Write Failed!\n");
            break;
        }
        bzero(buf,BUFFERSIZE);
    }
    printf("Success!\n");
    fclose(fp);
    close(client_socket);
    return 0;
}


大家帮忙啊!!!
搜索更多相关主题的帖子: 服务端 
2014-07-31 20:39
embed_xuel
Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19
等 级:贵宾
威 望:58
帖 子:3845
专家分:11385
注 册:2011-9-13
收藏
得分:5 
回复 楼主 snnile2012
不清楚,你把
FILE *fp=fopen("test.xml","w");改成
FILE *fp=fopen("test.xml","wb");试试呢?

总有那身价贱的人给作业贴回复完整的代码
2014-07-31 20:55
snnile2012
Rank: 1
等 级:新手上路
帖 子:9
专家分:4
注 册:2014-6-16
收藏
得分:0 
回复 2 楼 embed_xuel
不行。没有用。
我怀疑跟文件最后的结束标志有关。
只是怀疑,刚接触SOCKET编程没多久。
2014-07-31 21:19
砖家的谎言
Rank: 12Rank: 12Rank: 12
等 级:禁止访问
威 望:30
帖 子:693
专家分:3898
注 册:2013-12-6
收藏
得分:5 
看下文件指针移动

我不是砖家,要努力成为砖家。
2014-08-01 08:06
snnile2012
Rank: 1
等 级:新手上路
帖 子:9
专家分:4
注 册:2014-6-16
收藏
得分:0 
召唤大神!!!
2014-08-01 13:53
_user_die
Rank: 2
等 级:论坛游民
帖 子:12
专家分:10
注 册:2014-8-1
收藏
得分:5 
int write_length=fwrite(buf,sizeof(char),length+1,fp);
试试。结果告诉我。
2014-08-01 15:58
XM小美
Rank: 2
来 自:厦门
等 级:论坛游民
帖 子:6
专家分:25
注 册:2014-8-2
收藏
得分:5 
好难的样儿。

不爱写代码的小美在学敲代码。
2014-08-02 11:02
snnile2012
Rank: 1
等 级:新手上路
帖 子:9
专家分:4
注 册:2014-6-16
收藏
得分:0 
回复 6 楼 _user_die
我重新加了一个操作就好了。
fflush()
2014-08-02 13:33
快速回复:SOCKET 接受到的文件总是少了一个字节
数据加载中...
 
   



关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.018053 second(s), 9 queries.
Copyright©2004-2024, BCCN.NET, All Rights Reserved