Linux下C语言Socket实现文件传输

简单实现了个文件传输的程序

通过创建socket连接两台计算机,通过调用read,write系统调用来传递文件

客户机

#include <stdio.h>
#include <unistd.h>
#include <sys/socket.h>
#include <sys/types.h>
#include <fcntl.h>
#include <netinet/in.h>
#include <stdlib.h> //standard library

int main(int argc,char * argv[])
{
	
	//define
	int socketfd,filefd;
	int len,i=0;
	char wbuff[20],rbuff[20];
	char ip[20];
	struct sockaddr_in address; 
	printf("Host ip:");
	do
	{
   		ip[i++]=getchar();
	}while(ip[i-1]!='\n' && i<=20);
	//create socket
	socketfd = socket(AF_INET,SOCK_STREAM,0);
	//name socket(tell client the server address)
	address.sin_family = AF_INET;
	if(ip[0]=='\n')
	{
		address.sin_addr.s_addr = inet_addr("192.168.1.115");
	}
	else
	{
		address.sin_addr.s_addr = inet_addr(ip);
	}
	address.sin_port = htons(9999);
	len = sizeof(address);
	//connect the server socket
	if(connect(socketfd,(struct sockaddr *)&address,len)!=0)
	{
		perror("error");
		exit(1);
	}
	//read or write
	if(argc == 2)
	{
		printf("Transfer is starting!\n");
		filefd = open(argv[1],O_RDONLY);
		while(read(filefd,rbuff,50) == 50)
		{
			write(socketfd,rbuff,50);
		}
		printf("Transfer is complete\n");
		close(filefd);
	}
	else
	{
		printf("Path error");
		exit(1);
	}
	
	close(socketfd);
	exit(0);
}


服务器

会将接收到的文件统一命名为a1

#include <unistd.h>
#include <sys/socket.h>
#include <sys/types.h>
#include <stdio.h>
#include <stdlib.h>
#include <netinet/in.h>
#include <fcntl.h>
//Need log model
int main(int argc ,char * argv[])
{
	int server_len,client_len;
	int serverfd, clientfd,filefd;
	char rbuff[50];
	struct sockaddr_in server_addr,client_addr;
	
	serverfd = socket(AF_INET,SOCK_STREAM,0);
	server_addr.sin_family = AF_INET;
	server_addr.sin_port = htons(9999);
	server_addr.sin_addr.s_addr = htonl(INADDR_ANY);
	server_len = sizeof(server_addr);
	if(bind(serverfd,(struct sockaddr *)&server_addr,server_len)==-1)
	{
		perror("Bind error");
		exit(1);
	}
	if(listen(serverfd,5)==-1)
	{
		perror("Listen error");
		exit(1);
	}

	while(1)
	{	
		client_len = sizeof(client_addr);
		//until the client connect
		clientfd = accept(serverfd,(struct sockaddr *)&client_addr,&client_len);
		filefd = open("a1",O_WRONLY|O_CREAT,S_IRUSR|S_IWUSR);
		//read return the byte of one read
		//read return 0 means the end
		while(read(clientfd,rbuff,50)==50)
		{
			write(filefd,rbuff,50);
		}
		close(filefd);
		close(clientfd);
	}

}



  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值