概述
服务器:
#include
#include
#include
#include
#include
#include
#include
#define SERVER_PORT 6666
#define LISTEN_QUEUE 20
#define BUFFER_SIZE 1024
int main(int argc,char **argv)
{
struct sockaddr_in server_addr;
bzero(&server_addr,sizeof(server_addr));//全部置零
//设置地址相关的属性
server_addr.sin_family=AF_INET;
server_addr.sin_addr.s_addr=htons(INADDR_ANY);
server_addr.sin_port=htons(SERVER_PORT);
//创建套接字
int server_socket=socket(AF_INET,SOCK_STREAM,0);
if(server_socket<0)
{
printf("socket create errorn");
exit(1);
}
//绑定端口
if(bind(server_socket,(struct sockaddr*)&server_addr,sizeof(server_addr)))
{
printf("bind errorn");
exit(1);
}
//服务器端监听
if(listen(server_socket,LISTEN_QUEUE))
{
printf("Server listen errorn");
exit(1);
}
//服务器端一直运行
while(1)
{
pid_t pid;
struct sockaddr_in client_addr;
socklen_t length=sizeof(client_addr);
//accept返回一个新的套接字与客户端进行通信
int new_server_socket=accept(server_socket,(struct sockaddr*)&client_addr,&length);
//1*begin******************************************************************************
if(new_server_socket==-1)
{
printf("accept errorn");
continue;
}
else
{
printf("客户端%s连接成功n",inet_ntoa(client_addr.sin_addr));
pid=fork();
//3*begin**运行子进程*************************************************************
if(pid==0)
{
int data_len,flag=0;
char buffer[BUFFER_SIZE];
// 定义文件流
FILE *stream;
bzero(buffer,BUFFER_SIZE);
strcpy(buffer,"请输入要传输的文件的完整路径:");
strcat(buffer,"n");
send(new_server_socket,buffer,BUFFER_SIZE,0);
bzero(buffer,BUFFER_SIZE);
//2*begin**服务器接受数据*********************************************
if((stream=fopen("data","w"))==NULL)
{
printf("file open errorn");
exit(1);
}
else
{
bzero(buffer,BUFFER_SIZE);
}
// printf("正在接收来自%s的文件....n",inet_ntoa(client_addr.sin_addr));
//先将数据接受到缓冲区buffer中,再写入到新建的文件中
while(data_len=recv(new_server_socket,buffer,BUFFER_SIZE,0))
{
flag++;
if(flag==1)
{
printf("正在接收来自%s的文件....n",inet_ntoa(client_addr.sin_addr));
}
if(data_len<0)
{
printf("接收错误n");
exit(1);
}
//向文件中写入数据
int write_len=fwrite(buffer,sizeof(char),data_len,stream);
if(write_len>data_len)
{
printf("file write failedn");
exit(1);
}
bzero(buffer,BUFFER_SIZE);
}
if(flag>0)
printf("%s的文件传送完毕n",inet_ntoa(client_addr.sin_addr));
if(flag==0)
printf("%s的文件传输失败n",inet_ntoa(client_addr.sin_addr));
//2*end**服务器接受数据****************************************************
// rename("data",inet_ntoa(client_addr.sin_addr));
fclose(stream);
rename("data",inet_ntoa(client_addr.sin_addr));
exit(1);
}
//3*end**运行子进程**********************************************************
else
{
close(new_server_socket);
}
}
//1*end**************************************************************************************
close(new_server_socket);
}
return 0;
}
客户端:
#include
#include
#include
#include
#include
#include
#include
#include
#define SERVER_PORT 6666
#define BUFFER_SIZE 1024
int main(int argc,char **argv)
{
if(argc!=2)
{
printf("参数错误,清输入两个参数n");
exit(1);
}
FILE *stream;
struct sockaddr_in server_addr;
bzero(&server_addr,sizeof(server_addr)); //把一段内存区的内容全部设置为0
server_addr.sin_family = AF_INET; //internet协议族
server_addr.sin_addr.s_addr = inet_addr(argv[1]);
server_addr.sin_port = htons(SERVER_PORT);
int sfd;
sfd=socket(AF_INET,SOCK_STREAM,0);
if(sfd<0)
{
printf("socket errorn");
exit(0);
}
if(connect(sfd,(struct sockaddr*)&server_addr,sizeof(server_addr)) < 0)
{
printf("Can Not Connect To %sn",argv[1]);
exit(1);
}
char buffer[BUFFER_SIZE];
bzero(buffer,BUFFER_SIZE);
int length = recv(sfd,buffer,BUFFER_SIZE,0);
if(length < 0)
{
printf("Recieve Data From Server %s Failed!n", argv[1]);
exit(1);
}
printf("n%sn",buffer);
bzero(buffer,BUFFER_SIZE);
// fgets(buffer,1024,stdin);
// char filename[100];
gets(buffer);
//打开文件流
if((stream=fopen(buffer,"r"))==NULL)
{
printf("the file was not openedn");
exit(1);
}
bzero(buffer,BUFFER_SIZE);
printf("正在传输...n");
int len=0;
//不断读取并发送数据
while((len=fread(buffer,1,1024,stream))>0)
{
// printf("len=%dn",len);
if(send(sfd,buffer,len,0)<0)
{
printf("send file errorn");
break;
}
bzero(buffer,BUFFER_SIZE);
}
if(fclose(stream))
{
printf("file close errorn");
exit(1);
}
close(sfd);
return 0;
}
服务器端运行:
客户端运行:
在服务器端的程序中,当一个客户端连接,就创建一个独立的进程
最后
以上就是踏实啤酒为你收集整理的利用tcp完成文件传输linux,Linux下基于TCP的文件传输的全部内容,希望文章能够帮你解决利用tcp完成文件传输linux,Linux下基于TCP的文件传输所遇到的程序开发问题。
如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。
发表评论 取消回复