嵌入式客户端向服务器端上传文件
1、客户端的代码:(先运行服务器端 ,并且新建一个1.txt文件:Hello world!)
#include<stdio.h>
#include<sys/types.h>
#include<sys/stat.h>
#include<fcntl.h>
#include<string.h>
#include<unistd.h>
#include<arpa/inet.h>
int main(){
struct sockaddr_in servAddr;
memset(&servAddr, 0, sizeof(servAddr));
servAddr.sin_family = PF_INET;
servAddr.sin_port = htons(8888);
servAddr.sin_addr.s_addr = inet_addr("127.0.0.1");
//socket
int cliFd = socket(PF_INET, SOCK_STREAM, 0);
if(-1 == cliFd)
{
perror("socket error!");
return -1;
}
//connect
int ret = connect(cliFd, (struct sockaddr *)&servAddr, sizeof(servAddr));
if(-1 == ret)
{
perror("connect error!");
close(cliFd);
return -1;
}
printf("connect ok!\n");
char file[100];
printf("请输入要传送的文件名: \n");
gets(file);
int fd=open(file,O_RDONLY);//打开文件,读文件
if(-1==fd)
{
perror("open file error!\n");
return -1;
}
char buf[100];
memset(buf,0,sizeof(buf));//清空申请的内存空间
while(1)
{
int re=read(fd,buf,sizeof(buf));
if(0==re)
{
break;
}
send(cliFd,buf,re,0);
}
return 0;
}

2、服务器端代码:
#include<stdio.h>
#include<sys/types.h>
#include<sys/socket.h>
#include<arpa/inet.h>
#include<string.h>
#include<sys/stat.h>
#include<fcntl.h>
#include<unistd.h>
int main()
{
struct sockaddr_in servAdder;
memset(&servAdder,0,sizeof(servAdder));
servAdder.sin_family=PF_INET;
servAdder.sin_port=htons(8888);
servAdder.sin_addr.s_addr=inet_addr("127.0.0.1");
//socket
int servFd=socket(PF_INET,SOCK_STREAM,0);
if(-1==servFd)
{
perror("socket error\n");
return -1;
}
printf("socket ok\n");
//bind
int ret=bind(servFd,(struct sockadder *)&servAdder,sizeof(servAdder));
if(-1==ret)
{
perror("bind error");
return -1;
}
printf("bind ok\n");
//listen
ret= listen(servFd,10);
if(-1==ret)
{
perror("listen error");
return -1;
}
printf("listen ok!\n");
//accept
int connFd=accept(servFd,NULL,NULL);//对方的地址信息和长度,连接套接字
if(-1==connFd)
{
perror("accept error\n");
return -1;
}
printf("accept ok!\n");
int fd=open("server.txt",O_WRONLY|O_CREAT,0666);
if(fd<0)
{
perror("open file error\n");
return -1;
}
char buf[1024]={0};
memset(buf,0,sizeof(buf));//清空申请的内存空间
while(1)
{
int rec=recv(connFd,buf,sizeof(buf),0);
if(0==rec)
{
break;
}
write(fd,buf,rec);
}
printf("file copy success\n");
//printf("Allowed contents of flies:\n");
//puts(buf);
close(fd);
close(servFd);
close(connFd);
return 0;
}

3、 主要设计步骤:
(1)创建套接字(不同主机之间的进程进行双向通信的端点)
(2)绑定地址信息(bind)
(3)发起连接请求(connect)
(4)收发消息(send/recv)
(5)关闭通信(close)

4、上传文件思路:
服务器端:
1、打开文件
while(1)
{
2、接受客户端的消息recv
If(recv的返回值为0)
{
break;
}
3、将接受到的消息,写入文件
}
客户端:
1、打开文件open
while(1){
2、读文件read
If(read返回值为0)
{
break;
}
3、将读到的内容发送给服务器
}

5、 根据思路写出上传文件的实现代码:
服务器端:
int fd=open("server.txt",O_WRONLY|O_CREAT,0666);
if(fd<0)
{
perror("open file error\n");
return -1;
}
char buf[1024]={0};
memset(buf,0,sizeof(buf));//清空申请的内存空间
while(1)
{
int rec=recv(connFd,buf,sizeof(buf),0);
if(0==rec)
{
break;
}
write(fd,buf,rec);
}
printf("file copy success\n");
//printf("Allowed contents of flies:\n");
//puts(buf);
客户端:
int fd=open(file,O_RDONLY);//打开文件,读文件
if(-1==fd)
{
perror("open file error!\n");
return -1;
}
char buf[100];
memset(buf,0,sizeof(buf));//清空申请的内存空间
while(1)
{
int re=read(fd,buf,sizeof(buf));
if(0==re)
{
break;
}
send(cliFd,buf,re,0);
}
