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个回答

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

你的接收函数没有初始化i,另外你的收发都没有close文件,这习惯不好,不一定影响到结果但你可以先改了试试。

Csdn user default icon
上传中...
上传图片
插入图片
抄袭、复制答案,以达到刷声望分或其他目的的行为,在CSDN问答是严格禁止的,一经发现立刻封号。是时候展现真正的技术了!
立即提问