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

📄 function.c

📁 linux网络编程 客户端 可以清除缓存
💻 C
📖 第 1 页 / 共 2 页
字号:
					//printf("lastline=2\n");				}				else					lastline=0;			}			if(lastline==0 && reply_buf[i]==c_reply_code[0])			{				lastline=1;				//printf("lastline=1\n");			}		}  //end for		if(flag==1)			break;		else			reply_length=read(sockfd, reply_buf, REPLY_BUFFER_SIZE-2);	}	return reply_code;}//-------------------------------------------------------------------------------------------------int send_cmd(char *cmd, char *para, int sockfd) //从已经连接的sockfd中发送命令和参数 函数返回实际发送的字节数{	int send_length;	if(cmd)	{		strcpy(send_buf, cmd);		if(para)		{			strcat(send_buf,para);			strcat(send_buf,"\r\n");		}		else			strcat(send_buf,"\r\n");		cmd_length=strlen(send_buf);		printf("%s",send_buf);   //把要发出的命令输出		send_length=write(sockfd, send_buf, cmd_length);		if(send_length<0)		{			printf("Send error.\n");		}		return send_length;	}	return -1;}//-------------------------------------------------------------------------------------------------int get_data(int in, int out){	int new_sockfd = in;	if(passive == 0) //PORT	{		new_sockfd = port_accept(in);		if(new_sockfd<0)		{			return -1;		}	}	while(1)	{		data_length=read(new_sockfd, data_buf, DATA_BUFFER_SIZE);		if(data_length<=0)			break;		else			write(out, data_buf, data_length);	}	if(passive == 0)		close(new_sockfd);	return 0;}//-------------------------------------------------------------------------------------------------int cmd_format(char *cmd)  //将cmd整理。 返回参数的个数(包括命令本身){	int num=0;	int i=0, j=0;	for(i=0;cmd[i]!='\n';i++)	{		if(cmd[i]!=' ')		{				if(i==0)				num++;			if(i!=0 && cmd[i-1]==' ')			{				cmd[j]=' ';				j++;				num++;			}			cmd[j]=cmd[i];			j++;		}	}	cmd[j]='\0';	return num;}//-------------------------------------------------------------------------------------------------char *my_itoa(int i){	char *a=malloc(42);  //enough for a 128 bit integer	if(a)		sprintf(a,"%d",i);	return a;}//-------------------------------------------------------------------------------------------------int get_ip(char *ip)   // include <ioctl.h>{	int   sock;    	struct   sockaddr_in   sin;    	struct   ifreq   ifr;       	sock=socket(AF_INET,SOCK_DGRAM,0);    	if(sock==-1)    	{	   		perror("socket");    		return -1;   	}       	strncpy(ifr.ifr_name,   ETH_NAME,   IFNAMSIZ);    	ifr.ifr_name[IFNAMSIZ-1]=0;       	if(ioctl(sock,SIOCGIFADDR,&ifr)<0)    	{    		perror("ioctl");    		return -1;   	}       	memcpy(&sin,   &ifr.ifr_addr,   sizeof(sin));    	//fprintf(stdout,"eth0:   %s\n",inet_ntoa(sin.sin_addr));        	ip=strcpy(ip, inet_ntoa(sin.sin_addr));  	return 0;}//-------------------------------------------------------------------------------------------------int rand_local_port(){	int port;	srand((unsigned)time(NULL));	port = rand() % 40000 + 1025;	return port;}//-------------------------------------------------------------------------------------------------int create_datasock(){	if(passive==1)  //pasv  先发送pasv命令到服务器,然后建立一个数据sockfd和收到的地址连接上去。	{		char *temp;		int data_port;		int client_data_sockfd;		// 向服务器发送pasv 获取服务器的数据端口号 保存在data_port		send_cmd("PASV",NULL, client_sockfd); //进入被动模式		//reply_length=recv(client_sockfd, reply_buf, REPLY_BUFFER_SIZE,0);		reply_length=get_reply(client_sockfd);		if(reply_length<0)			return 0;		reply_buf[reply_length]='\0';		if(atoi(reply_buf)==227)  //说明进入了被动模式		{			temp=strrchr(reply_buf,','); //strrchr()函数的作用是:查找一个字符串在另一个字符串中末次出现的位置.			data_port=atoi(temp+1);			*temp='\0';   			temp=strrchr(reply_buf,',');			data_port+=atoi(temp+1)*256;		}		//printf("data_port: %d", data_port);		//将server_addr的端口号改成数据端口号		if(data_port!=0)			server_addr.sin_port=htons(data_port);		//新建一个client_data_sockfd和server_addr连接connect		client_data_sockfd=socket(AF_INET,SOCK_STREAM,0);		if(client_data_sockfd<0)		{			printf("create client_data_sockfd failed.");			return -1;		}		if(connect(client_data_sockfd,(struct sockaddr *)&server_addr,sizeof(server_addr))<0)		{			printf("cannot connect to the server: %s, port:%d\n",inet_ntoa(server_addr.sin_addr),ntohs(server_addr.sin_port));			close(client_data_sockfd);			return -1;		}		return client_data_sockfd;	}  //end if(passive==1)	else   //port  客户端设定一个数据端口,然后建立一个数据socket和该端口绑定,然后给服务器发送port命令 该命令包含客户端接受数据的端口。	{		//建立一个数据socket		int client_data_sockfd;		int i;		client_data_sockfd=socket(AF_INET,SOCK_STREAM,0);		if(client_data_sockfd<0)		{			printf("create client_data_sockfd failed.");			return -1;		}		//为客户端地址client_addr随机选取一个地址		//int data_port=rand_local_port();		bzero(&client_addr, sizeof(client_addr));		client_addr.sin_family=AF_INET;					//TCP/IP协议族		client_addr.sin_addr.s_addr=htonl(INADDR_ANY);  //地址为本机ip		client_addr.sin_port=0;					//端口为随机选取		if(bind(client_data_sockfd, (struct sockaddr *)&client_addr, sizeof(client_addr))<0)		{			perror("bind");			return -1;		}		if(listen(client_data_sockfd,3)<0)		{			perror("listen");			return -1;		}		int len = sizeof(client_addr);		getsockname(client_data_sockfd, (struct sockaddr*)&client_addr, &len);				unsigned int ip;		unsigned short port;		ip = ntohs(client_addr.sin_addr.s_addr);		port = ntohs(client_addr.sin_port);		char address[24];		address[0] = '\0';		strcat(address, my_itoa((int)((ip>>24)&0xff)) );		strcat(address, ",");		strcat(address, my_itoa((int)((ip>>16)&0xff)) );		strcat(address, ",");		strcat(address, my_itoa((int)((ip>>8)&0xff)) );		strcat(address, ",");		strcat(address, my_itoa((int)((ip)&0xff)) ); 		strcat(address, ",");		strcat(address, my_itoa((int)((port>>8)&0xff)) );		strcat(address, ",");		strcat(address, my_itoa((int)((port)&0xff)) );		send_cmd("PORT ", address, client_sockfd);		if(get_reply(client_sockfd)!=200)		{			printf("can not use PORT mode! Please use \"passive\" change to PASV mode.\n");			return -1;		}		else 			return client_data_sockfd;		//} //end while		close(client_data_sockfd);		return -1;	}  //end else (PORT mode)}//-------------------------------------------------------------------------------------------------int port_accept(int client_data_sockfd)   // 在port模式下时候用来accept对方的connect后建立数据通路 返回新的数据的sockfd{	int set=sizeof(client_addr);	int new_sockfd=accept(client_data_sockfd, (struct sockaddr*) &client_addr, (socklen_t *)&set);  										// new_sockfd是用于port模式下accept对方的connect后建立数据通路的。	if(new_sockfd<0)	{		printf("Sorry you can't use PORT mode..\n");		//close(new_sockfd);		close(client_data_sockfd);		return -1;	}	close(client_data_sockfd);	return new_sockfd;}//-------------------------------------------------------------------------------------------------void show_command(){	printf("bye:                              terminate ftp session and exit\n");	printf("cd     remote-directory:        change remote working directory\n");	printf("close:                            terminate ftp session\n");	printf("delete remote-file:               delete remote file\n");	printf("get    remote-file [local-file]:  receive file\n");	printf("help:                             print local help information\n");	printf("lcd    local-directory:           change local working directory\n");	printf("ldir:                             list contents of local directory\n");	printf("lmkdir directory-name:            make directory on the local machine\n");	printf("lpwd:                             print local working directory\n");	printf("lrmdir directory-name:            remove directory on the local machine\n");	printf("ls:                               list contents of remote directory\n");	printf("mirror [remote [local]]:          receive remote fold\n");	printf("mkdir  directory-name:            make directory on the remote machine\n");	printf("open   host-name [port]:          connect to remote ftp\n");	printf("passive:                          enter passive transfer mode\n");	printf("put    local-file [remote-file]:  send one file\n");	printf("pwd:                              printf remote working directory\n");	printf("quit:                             terminate ftp session and exit\n");	printf("rename from-name to-name:         rename file\n");	printf("rmdir  directory-name:            remove directory on the remote machine\n");	printf("user:                             send new user information\n");	printf("?:                                printf local help information\n");	return;}//-------------------------------------------------------------------------------------------------

⌨️ 快捷键说明

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