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

📄 pub_fun.c

📁 FTP服务器
💻 C
📖 第 1 页 / 共 2 页
字号:
#include "extern.h"/*---------------------------------------------------------------------------------------------------------*//*初始化套接字并设置其地址,并命名*/int Init_Socket(int sin_port, char *address){	int opt=1;	int sockfd;	int bind_state;	int address_len;	struct sockaddr_in sock_address;	//创建服务器套接字	sockfd = socket(AF_INET, SOCK_STREAM, 0);	//设置地址	sock_address.sin_family = AF_INET;	sock_address.sin_addr.s_addr = inet_addr(address);	sock_address.sin_port = htons(sin_port);	address_len = sizeof(sock_address);	//名称套接字	setsockopt(sockfd, SOL_SOCKET, SO_REUSEADDR, &opt, sizeof(opt));	bind_state = bind(sockfd, (struct sockaddr *)&sock_address, address_len);		if( sockfd == -1 || bind_state !=0 )	{		perror("init");		return 0;	}	else	{		return sockfd;	}}/*---------------------------------------------------------------------------------------------------------*//*接受连接*/int Accept_Connect(int sockfd, struct sockaddr_in *address){	int address_len;	int result;	fd_set readfds;	struct timeval timeout;		FD_ZERO(&readfds);	FD_SET(sockfd, &readfds);	timeout.tv_sec = 1;	timeout.tv_usec = 500000;;		result = select(FD_SETSIZE, &readfds, NULL, NULL, &timeout);	address_len = sizeof(address);	switch(result)	{		case 0:			return 0;		case -1:			return -1;		default:			if(FD_ISSET(sockfd, &readfds))			{				sockfd = accept(sockfd, (struct sockaddr *)&address, &address_len);				if(sockfd == -1)				{					return -2;				}				else					return sockfd;			}	}}/*---------------------------------------------------------------------------------------------------------*//*发送信息SEND()*/int Send_Message(int sockfd, char *buf, int len){	int result;	int temp;	fd_set readfds;	struct timeval timeout;		FD_ZERO(&readfds);	FD_SET(sockfd, &readfds);	timeout.tv_sec = 1;	timeout.tv_usec = 500000;		result = select(sockfd+1, NULL, &readfds, NULL, &timeout);	switch(result)	{		case 0:			return 0;		case -1:			return -1;		default:			if(FD_ISSET(sockfd, &readfds))			{				temp = send(sockfd, buf, len, 0);				if(temp == strlen(buf))				{					return 1;				}				else				{					return 0;				}			}	}}/*---------------------------------------------------------------------------------------------------------*//*接受信息RECV()*/int Recv_Message(int sockfd, char *buf, int len){	int result;	int temp;	fd_set readfds;	struct timeval timeout;		FD_ZERO(&readfds);	FD_SET(sockfd, &readfds);	timeout.tv_sec = 1;	timeout.tv_usec = 500000;		result = select(sockfd+1, &readfds, NULL, NULL, &timeout);	switch(result)	{		case 0:			return 0;		case -1:			return -1;		default:			if(FD_ISSET(sockfd, &readfds))			{				temp = recv(sockfd, buf, len, 0);				if (temp<=0)				{					if (temp==0)					{						close(sockfd);					}					printf("%d",temp);					return -1;				}				return temp;			}	}}/*---------------------------------------------------------------------------------------------------------*//*FTP最终状态返回的函数*/void Ftp_State_Return(char *buf,int state){	switch(state)	{			case 150:	strcpy(buf,"150 Here comes the directory listing\r\n");break;		case 200:	strcpy(buf,"200 Switching ASCII mode.\r\n");break;		case 213:	strcpy(buf,"213 Status: %qd bytes transferred\r\n");break;		case 215:	strcpy(buf,"215 Linux Type: L8\r\n");break;		case 220:	strcpy(buf,"220 LspFtp 1.1\r\n");break;		case 221:	strcpy(buf,"221 Goodbye.\r\n");break;		case 226:	strcpy(buf,"226 Directory send OK\r\n");break;			case 227:	strcpy(buf,"227 Entering Passive Mode (192,168,0,188,143,175)\r\n");break;		case 230:	strcpy(buf,"230 Login successful .Have fun\r\n");break;		case 250:	strcpy(buf,"250 Directory successfully changed.\r\n");break;		case 257:	strcpy(buf,"257 /home/xwqiu\r\n");break;		case 331:	strcpy(buf,"331 Please specify the password\r\n");break;				case 350:	strcpy(buf,"350 Restart position accepted\r\n");break;		case 421:	strcpy(buf,"421 Timeout\r\n");break;		case 426:	strcpy(buf,"426 Transfer aborted. Data connection closed.\r\n");break;			case 500:	strcpy(buf,"500 Unknown command.\r\n");break;		case 530:	strcpy(buf,"530 Please login with USER and PASS\r\n");break;	}}/*---------------------------------------------------------------------------------------------------------*//*获取文件目录详细信息*/int List(char *buf, int len){	DIR *dir;	struct dirent *ent;	int off = 0;	//打开当前目录	if ((dir = opendir(".")) < 0) {		makelog(NULL,"opendir() failed:%s\n");		return -1;	}		buf[0] = '\0';	while ((ent = readdir(dir)) != NULL)	{		char *filename = ent->d_name;		struct stat st;		char mode[] = "----------";		struct passwd *pwd;		struct group *grp;		struct tm *ptm;		char timebuf[BUFSIZ]; 		int timelen;				if (strcmp(filename, ".") == 0 ||			strcmp(filename, "..") == 0)			continue;				if (stat(filename, &st) < 0) {			closedir(dir);			makelog(NULL,"stat() failed:%s\n");			return -1;		}				if (S_ISDIR(st.st_mode))			mode[0] = 'd';		if (st.st_mode & S_IRUSR)			mode[1] = 'r';		if (st.st_mode & S_IWUSR)			mode[2] = 'w';		if (st.st_mode & S_IXUSR)			mode[3] = 'x';		if (st.st_mode & S_IRGRP)			mode[4] = 'r';		if (st.st_mode & S_IWGRP)			mode[5] = 'w';		if (st.st_mode & S_IXGRP)			mode[6] = 'x';		if (st.st_mode & S_IROTH)			mode[7] = 'r';		if (st.st_mode & S_IWOTH)			mode[8] = 'w';		if (st.st_mode & S_IXOTH)			mode[9] = 'x';		mode[10] = '\0';		off += snprintf(buf + off, len - off, "%s ", mode);		off += snprintf(buf + off, len - off, "%d ", 1);				if ((pwd = getpwuid(st.st_uid)) == NULL) {			closedir(dir);			return -1;		}		off += snprintf(buf + off, len - off, "%s ", pwd->pw_name);				if ((grp = getgrgid(st.st_gid)) == NULL) {			closedir(dir);			return -1;		}		off += snprintf(buf + off, len - off, "%s ", grp->gr_name);			off += snprintf(buf + off, len - off, "%d ", st.st_size);				ptm = localtime(&st.st_mtime);		if (ptm && (timelen = strftime(timebuf, sizeof(timebuf), "%b %s %H:%M", ptm)) > 0) {			timebuf[timelen] = '\0';			off += snprintf(buf + off, len - off, "%s ", timebuf);		}		else {			closedir(dir);			return -1;		}				off += snprintf(buf + off, len - off, "%s\r\n", filename);			}		return off;}	/*---------------------------------------------------------------------------------------------------------*//*PORT模式,用户发IP和端口过来,进行相应的转换*/int Get_Ip_Port(char *buf, char *ip, int *port){	int len = 0;	int i = 0;	int j = 0;	char t_port[10];	memset(t_port, 0, 10);	if(!buf)	{		perror("error");		return 0;	}		strcpy(ip, buf);	len = strlen(buf);	//取IP	for(i = 0; i < len; i++)	{		if(ip[i] == ',')		{			j++;			if(j == 4)			{				strcpy(t_port, ip+i+1);				ip[i] = '\0';				j = 0;				break;			}			ip[i] = '.';		}	}		//取端口号	for(i = 1; i <strlen(t_port); i++)	{		if(t_port[i] == ',')		{			t_port[i] = '\0';			*port = atoi(t_port) * 256;			*port += atoi(&t_port[i+1]);			break;		}			}    return 1;}/*---------------------------------------------------------------------------------------------------------*//*FTP 控制*/int Ftp_Ctrl(int argc, char **argv, int *startfun()){	int iret;	signal(SIGCHLD, SIG_IGN);	if (argc!=2)	{		printf("Usage: ftpd {start|stop|restart}\n");		return -1;	}	if (strcmp(argv[1], "start")==0)	{		iret = Ftp_Start(argv[0], startfun);		return iret;	}		if (strcmp(argv[1], "stop")==0)	{			iret = Ftp_Stop(argv[0]);		return iret;	}	if (strcmp(argv[1], "restart")==0) 	{		return	Ftp_Restart(argv[0], startfun);	}	printf("Usage:ftpd {start|stop|restart}\n");	return -1;}/*---------------------------------------------------------------------------------------------------------*//*FTP 启动*/int Ftp_Start(char *appname, int *startfun()){	int thisid=0;	thisid=getpid();	char buff[1024]={0};		Get_Pid(appname,buff,1024);			char tmppid[256];	char *p=buff;	int tmpid,i=0;			while (*p) {		while (isspace(*p)&&*p)p++;		i=0;		while (!isspace(*p)&&*p)			tmppid[i++]=*p++;		if(*p=='\0')break;		tmpid=atoi(tmppid);		if (thisid!=tmpid) {			printf( "[ Service has been launched  ]\n");			return -1;		}	}			char *strtmp="Ftp Server Start";	write(1,strtmp,strlen(strtmp));		int pointcount=20;	for (;pointcount>0;pointcount--) {

⌨️ 快捷键说明

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