linux下文件传输程序

//客户端

#include<stdio.h>

#include<strings.h>
#include<unistd.h>
#include<sys/types.h>
#include<sys/socket.h>
#include<netinet/in.h>
//#include<arpa/inet.h>
#include<netdb.h>
#include <stdlib.h>
#include <sys/stat.h>
#include <fcntl.h>

#define PORT 1234
#define MAXDATASIZE 100
int main(int argc,char *argv[])
{
int sockfd,num;
char buf[MAXDATASIZE];
struct hostent *he;
struct sockaddr_in server;
char buffer[100];
FILE * input;
int nn;
if(argc!=2)
{
printf("Usage:%s<IP Address>\n",argv[0]);
exit(1);
}
/*
if((he=gethostbyname(argv[1]))==NULL)
{
printf("gethostbyname() error\n");
exit(1);
}
*/
/*
if(inet_pton(AF_INET,argv[1],&server.sin_addr))
{
perror("server() error\n");
exit(1);

}
*/
if((sockfd=socket(AF_INET,SOCK_STREAM,0))==-1)
{
perror("socket() error\n");
exit(1);
}
bzero(&server,sizeof(server));
server.sin_family=AF_INET;
server.sin_port=htons(PORT);
if(inet_pton(AF_INET,argv[1],&server.sin_addr) <=0)
{
perror("server() error\n");
exit(1);

}

//server.sin_addr=*((struct in_addr *)he->h_addr);
if(connect(sockfd,(struct sockaddr *)&server,sizeof(server))==-1)
{
perror("connect() error\n");
exit(1);

}

//接收文件名,并保存在buf中

if((num=recv(sockfd,buf,MAXDATASIZE,0))==-1)
{
perror("recv() error\n");
exit(1);
}
buf[num]='\0';
printf("server message: %s\n",buf);

//接收文件内容保存在buffer中
if((num=recv(sockfd,buffer,MAXDATASIZE,0))==-1)
{
perror("recv() error\n");
exit(1);
}
buffer[num]='\0';

printf("%s\n",buffer);

//创建文件

input = fopen(buf,"wb");
if(input == NULL){
perror("open wrong!");
exit(EXIT_FAILURE);

}

把接收到的内容写入文件

nn = fwrite(buffer,1,num,input);
printf("%d\n",nn);
fclose(input);

close(sockfd);

}


服务器端:

#include<stdio.h>
#include<strings.h>
#include<unistd.h>
#include<sys/types.h>
#include<sys/socket.h>
#include<netinet/in.h>
#include<arpa/inet.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <stdlib.h>
#define PORT 1234
#define BACKLOG 2
main(int argc,char *argv[])
{
int listenfd,connectfd;
struct sockaddr_in server;
struct sockaddr_in client;
socklen_t addrlen;
int len;
char buffer[100];
int nn,mm;
FILE* input;

if((listenfd=socket(AF_INET,SOCK_STREAM,0))==-1)
{
perror("socket() error.");
exit(1);
}

int opt=SO_REUSEADDR;
setsockopt(listenfd,SOL_SOCKET,SO_REUSEADDR,&opt,sizeof(opt));
bzero(&server,sizeof(server));
server.sin_family=AF_INET;
server.sin_port=htons(PORT);
server.sin_addr.s_addr=htonl(INADDR_ANY);
if(bind(listenfd,(struct sockaddr *)&server,sizeof(server))==-1)
{
perror("Bind() error");
exit(1);
}
if(listen(listenfd,BACKLOG)==-1)
{
perror("listen() error.\n");
exit(1);
}
len=sizeof(client);
if((connectfd=accept(listenfd,(struct sockaddr*)&client,&len))==-1)
{
perror("accept() error\n");
exit(1);
}
//printf("you got a connection from client's ip is %s,port is %d\n",ntohl(client.sin_addr.s_addr),htons(client.sin_port));
//打开文件
input = fopen(argv[1],"rb");
if(input == NULL){
perror("open wrong!");
exit(EXIT_FAILURE);
}

把文件中的内容读到buffer中
nn = fread(buffer,1,12,input);
buffer[12]='\0';
printf("%s\n",buffer);

//发送文件名
send(connectfd,argv[1],strlen(argv[1]),0);

睡眠1秒,使客户端准备接收数据
sleep(1);

//发送buffer
mm=send(connectfd,buffer,nn,0);
printf("%d\n",mm);
fclose(input);
close(connectfd);
close(listenfd);
}

注意:nn = fread(buffer,1,12,input)返回值nn为12。如果是nn = fread(buffer,3,4,input);则返回值为4.


评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值