rtm15056 2017-03-21 11:00 采纳率: 0%
浏览 1810

C语言socket建立的简单文件传输问题

客户端发送文件

#include
#include
#include
#include
#include
#include
#include

int main(int argc,char **argv)
{
ssize_t i=1;
char buf[512];
int fp;
int ret;
int socket_client;
struct sockaddr_in addr_in;

socket_client = socket(AF_INET,SOCK_STREAM,0);//创建套接字
if(socket_client<0){
    perror("socket err");
    return -1;
}

addr_in.sin_family = AF_INET;
addr_in.sin_port = htons(9001);
addr_in.sin_addr.s_addr = inet_addr("192.168.1.77");

ret = connect(socket_client,(struct sockaddr *)&addr_in,sizeof(addr_in));//链接
if(ret<0){
    perror("connect err");
    return -2;
}
scanf("%s",buf);//写入文件名
ret = send(socket_client,&buf,sizeof(buf),0);//发送文件名
if(ret<0){
    perror("send err");
    return -11;
}
fp = open(buf,O_RDONLY);//打开要发送的文件
if(fp<0){
    fprintf(stderr,"open err\n");
    return -1;
}
while(1){
    if(i==0){
    break;
    }
memset(buf,0,sizeof(buf));//空间清0
i = read(fp,buf,sizeof(buf));//读文件到buf
if(i<0){
    perror("read err");
    return -7;
}else if(i==0){
    break;
}
printf("%s\n",buf);//打印一遍用于观察
ret = send(socket_client,buf,sizeof(buf),0);//发送读取到的内容
if(ret<0){
    perror("send err");
    return -8;
}
printf("%d\n",ret);//打印发送的大小
sleep(1);
}

close(socket_client);
return 0;

}

服务器接收文件

#include
#include
#include
#include
#include
#include
#include
#include
#include

int main(int aegc,char **argv)
{
char buf[512];
ssize_t i;
int fp;
int ret;
int socket_sever;
int socket_client;
struct sockaddr_in addr_in;

socket_sever = socket(AF_INET,SOCK_STREAM,0);//定义socket套接字
if(socket_sever<0){
    perror("socket err");
    return -1;
}

addr_in.sin_family = AF_INET;
addr_in.sin_port = htons(9001);
addr_in.sin_addr.s_addr = inet_addr("192.168.1.77");

ret = bind(socket_sever,(struct sockaddr *)&addr_in,sizeof(addr_in));//绑定
if(ret<0){
    perror("bind err");
    return -2;
}

ret = listen(socket_sever,5);//监听
if(ret<0){
    perror("listen err");
    return -3;
}

socket_client = accept(socket_sever,NULL,NULL);//建立链接
if(socket_client<0){
    perror("accept err");
    return -4;
}

ret = recv(socket_client,&buf,sizeof(buf),0);//接收文件明
if(ret<0){
    perror("recv err");
    return -6;
}
fp = open(buf,O_WRONLY | O_CREAT | O_APPEND,0644);//创建并打开文件
if(fp<0){
    fprintf(stderr,"open err");
    return -1;
}
while(1){
    if(i==0){
        break;
    }
    memset(buf,0,sizeof(buf));//接收空间清0
ret = recv(socket_client,buf,sizeof(buf),0);//接收
    if(ret<0){
    perror("recv err");
    return -6;
}else if(ret==0){
    break;
}

printf("%s\n",buf);//打印一遍用于观察
i = write(fp,buf,sizeof(buf));//写入打开的文件
if(i<0){
    perror("write err");
    return -13;
}else if(i==0){
    break;}

sleep(1);

}
close(socket_sever);
close(socket_client);

}

问题出现在写入完成后末尾出现连续的^@^@^@^@^@^@^@^@符号,占用空间

  • 写回答

2条回答

  • threenewbee 2017-03-21 11:25
    关注

    需要在发送的时候将文件实际长度给接收端,接收端写文件后设置下文件结束指针位置。

    评论

报告相同问题?

悬赏问题

  • ¥15 delta降尺度计算的一些细节,有偿
  • ¥15 Arduino红外遥控代码有问题
  • ¥15 数值计算离散正交多项式
  • ¥30 数值计算均差系数编程
  • ¥15 redis-full-check比较 两个集群的数据出错
  • ¥15 Matlab编程问题
  • ¥15 训练的多模态特征融合模型准确度很低怎么办
  • ¥15 kylin启动报错log4j类冲突
  • ¥15 超声波模块测距控制点灯,灯的闪烁很不稳定,经过调试发现测的距离偏大
  • ¥15 import arcpy出现importing _arcgisscripting 找不到相关程序