⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 client.c

📁 老师编写的客户端服务器文件传送程序,在vmware redhat linux下测试能正常使用,相当经典
💻 C
字号:
#include<stdlib.h>
#include<stdio.h>
#include<errno.h>
#include<string.h>
#include<netdb.h>
#include<sys/types.h>
#include<netinet/in.h>
#include<sys/socket.h>
#include<arpa/inet.h>


#define SERVER_PORT 6667
#define BUFFER_SIZE 1024
#define FILE_NAME_MAX_SIZE 512
//void ClienToServer(int ,char**);
void SendRequest(char**argv)
{	
	
	//设置一个socket地址结构client_addr,代表客户机internet地址, 端口
	struct sockaddr_in client_addr;
	 //把一段内存区的内容全部设置为0
	bzero(&client_addr,sizeof(client_addr));
	//internet协议族
	client_addr.sin_family = AF_INET;
	//INADDR_ANY表示自动获取本机地址
	client_addr.sin_addr.s_addr = htons(INADDR_ANY);
	//0表示让系统自动分配一个空闲端口
	client_addr.sin_port = htons(0);
	//创建用于internet的流协议(TCP)socket,用client_socket代表客户机socket
	int client_socket = socket(AF_INET,SOCK_STREAM,0);
	if(client_socket<0)
	{
		printf("Create socket failed!\n");
		exit(1);
	}
	
	//把客户机的socket和客户机的socket地址结构联系起来
	if(bind(client_socket,(struct sockaddr*)&client_addr,sizeof(client_addr)))
	{
		printf("Client bind port failed!\n");
		exit(1);
	}
	
	//设置一个socket地址结构server_addr,代表服务器的internet地址, 端口
	struct sockaddr_in server_addr;
	bzero(&server_addr,sizeof(server_addr));
	server_addr.sin_family = AF_INET;
	//服务器的IP地址来自程序的参数
	if(inet_aton(argv[1],&server_addr.sin_addr)==0)
	{
		printf("Server IP address error!\n");
		exit(1);
	}
	server_addr.sin_port = htons(SERVER_PORT);
	socklen_t server_addr_length = sizeof(server_addr);
	
	//向服务器发起连接,连接成功后client_socket代表了客户机和服务器的一个socket连接
	if(connect(client_socket,(struct sockaddr*)&server_addr,server_addr_length)<0)
	{
		printf("Connect %s failed!\n",argv[1]);
		exit(1);
	}
	char file_name[FILE_NAME_MAX_SIZE+1];
	bzero(file_name,FILE_NAME_MAX_SIZE+1);
	printf("Please enter the file name you want to open:\t");
	scanf("%s",file_name);
	char buffer[BUFFER_SIZE];
	bzero(buffer,BUFFER_SIZE);
	strncpy(buffer,file_name,strlen(file_name)>BUFFER_SIZE?BUFFER_SIZE:strlen(file_name));
	
	//向服务器发送buffer中的数据
	send(client_socket,buffer,BUFFER_SIZE,0);
	FILE * fp = fopen(file_name,"w");
	
	
	//从服务器接收数据到buffer中
	bzero(buffer,BUFFER_SIZE);
	int length = 0;
	int write_length=0;
	while(length=recv(client_socket,buffer,BUFFER_SIZE,0))
	{
		if(length<0)
		{
			printf("Receive data from %s failed!\n",argv[1]);
			break;
		}
		write_length = fwrite(buffer,sizeof(char),length,fp);
		if(write_length<length)
		{
			printf("File %s write failed!\n",file_name);
			break;
		}
		bzero(buffer,BUFFER_SIZE);
	}


	if(write_length<=0)
	{
		printf("File %s dosen't exist!\n",file_name);
		exit(1);
	}
	else{
		printf("Receive file %s from Server[%s] finished ! The content lists as follows: \n",file_name,argv[1]);
		fclose(fp);
		FILE * fo = fopen(file_name,"r");
		char ch=fgetc(fo); 
		while(ch!=EOF) 
		{ 
			printf("%c",ch); 
			ch=fgetc(fo); 
		} 
		fclose(fo);
	}


	 //关闭socket
	close(client_socket);
	//return 0;
}

int main(int argc,char**argv)
{
	if(argc !=2)
	{
		//printf("请使用类似这样的命令: %s ServerIPAddress\n",argv[0]);
		printf("Please enter command like this: %s ServerIPAddress\n",argv[0]);
		exit(1);
	}
	int i=0;
	for(i;i<1000;i++)
		SendRequest(argv);
	return 0;
}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -