客户端和服务端建立连接之后,客户端向服务端发送一个文件的路径。
服务端通过文件路径打开这个文件,每次读取文件内容发送给客户端,
实现文件的拷贝。
服务端的程序
#include<stdio.h>
#include<stdlib.h>
#include<netdb.h>
#include<sys/socket.h>
#include<sys/types.h>
#include<arpa/inet.h>
#include<unistd.h>
#include<sys/stat.h>
#include<fcntl.h>
#include<dirent.h>
#include<string.h>
#define PORT 1234
#define BACKLOG 1
void send_file();
int num=0;
int listenfd,connectfd;
struct sockaddr_in server;
struct sockaddr_in client;
socklen_t addrlen;
int main(int argc,char *argv[])
{
if((listenfd=socket(PF_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=PF_INET;
server.sin_port=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");
exit(1);
}
addrlen=sizeof(client);
if((connectfd=accept(listenfd,(struct sockaddr *)&client,&addrlen))==-1)
{
perror("accept error");
exit(1);
}
printf("client's ip is %s,port is %d\n",inet_ntoa(client.sin_addr),htons(client.sin_port));
char file_name[256];
memset(file_name,'\0',sizeof(file_name));
num=recv(connectfd,file_name,255,0);
if(num==-1){
perror("recv() errror!");
exit(1);
}
puts(file_name);
send_file(file_name);
close(listenfd);
close(connectfd);
}
void send_file(char file_name[]) //读取文件内容循环发送
{ int fd,read_num,write_num,src;
char buf[1024];
memset(buf,'\0',sizeof(buf));
src=open(file_name,O_WRONLY,0644);
if(src<0){
perror("open failure");
exit(0);
}
while((read_num=read(src,buf,50))>0)
{
send(connectfd,buf,sizeof(buf),0);
}
}
客户端的程序
#include<stdio.h>
#include<stdlib.h>
#include<netdb.h>
#include<string.h>
#include<sys/socket.h>
#include<sys/types.h>
#include<arpa/inet.h>
#include<unistd.h>
#define PORT 1234;
#define MASDATASIZE 100
int main(int argc,char *argv[])
{
int sockfd,num;
char buf[MASDATASIZE];
char file[256];
struct sockaddr_in server;
if(argc!=2){
printf("Usage:%s <IP ADDRESS>\n",argv[0]);
exit(1);
}
if((sockfd=socket(PF_INET,SOCK_STREAM,0))==-1){
perror("socket() errror!");
exit(1);
}
bzero(&server,sizeof(server));
server.sin_family=PF_INET;
server.sin_port=PORT;
inet_aton(argv[1],&(server.sin_addr));
if(connect(sockfd,(struct sockaddr *)&server,sizeof(server))==-1)
{
perror("connect () errror");
exit(1);
}
strcpy(file,"/home/june/a.txt"); //填写的路径名
send(sockfd,file,sizeof(file),0);
do{
if((num=recv(sockfd,buf,MASDATASIZE,0))==-1){
perror("recv() errror!");
exit(1);
}
printf("%d\n",num);
//puts(buf); 想通过puts看看有没有接收成功
}while(num>0);
printf("server message len: %d :%s\n",num,buf);
close(sockfd);
return 0;
}
在同一台机器上进行测试的
现在碰到的问题是实现不了服务端循环发送文件内容,客户端循环接收文件内容,错误提示Connection reset by peer