📄 pub_fun.c
字号:
#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 + -