📄 scon.c
字号:
#include <stdlib.h>#include <string.h>#include <sys/types.h>#include <sys/time.h>#include <sys/stat.h>#include <ctype.h>#include <fcntl.h>#include <sys/errno.h>#include <sys/socket.h>#include <netinet/in.h>#include <netdb.h>#include <unistd.h>#include "scon.h"#include "command.h"extern char szBuffer[];extern char szBuff[];extern int ReadCommand;int hListenSocket = INVALID_SOCKET;int hControlSocket= INVALID_SOCKET;int hDataSocket= INVALID_SOCKET;int Connected = 0;char szHost[1024] = {0};int bSendPort = 1;char DnszBuff[128];int GetListenSocket(){int sockfd, flag=1,len;struct sockaddr_in serv_addr, TempAddr;char *port,*ipaddr;char szBuffer[64]={0};if ((sockfd = socket(AF_INET, SOCK_STREAM, 0)) < 0) {perror("socket");return INVALID_SOCKET;}if( bSendPort ) {bzero((char *) &serv_addr, sizeof(serv_addr));serv_addr.sin_family = AF_INET;serv_addr.sin_addr.s_addr = htonl(INADDR_ANY);serv_addr.sin_port = htons(0); }else {if(setsockopt(sockfd,SOL_SOCKET,SO_REUSEADDR,(char *)&flag,sizeof(flag)) < 0) {perror("setsockopt");close(sockfd);return INVALID_SOCKET;}}if (bind(sockfd,(struct sockaddr *)&serv_addr,sizeof(serv_addr)) < 0) {perror("bind");close(sockfd);return INVALID_SOCKET;}len = sizeof(serv_addr);if(getsockname(sockfd,(struct sockaddr *)&serv_addr,&len)<0) {perror("getsockname");close(sockfd);return INVALID_SOCKET;}len = sizeof(TempAddr);if(getsockname(hControlSocket,(struct sockaddr *)&TempAddr,&len)<0) {perror("getsockname");close(sockfd);return INVALID_SOCKET;}ipaddr = (char *)&TempAddr.sin_addr;port = (char *)&serv_addr.sin_port;#define UC(b) (((int)b)&0xff)sprintf(szBuffer,"PORT %d,%d,%d,%d,%d,%d\r\n",UC(ipaddr[0]), UC(ipaddr[1]), UC(ipaddr[2]), UC(ipaddr[3]),UC(port[0]), UC(port[1]));if( listen(sockfd, 1) < 0) {perror("listen");close(sockfd);return INVALID_SOCKET;}SendControlMsg(szBuffer,strlen(szBuffer));GetReply();hListenSocket = sockfd;return sockfd;}int AcceptConnection(){struct sockaddr_in cli_addr;int clilen = sizeof(cli_addr);int sockfd;sockfd = accept(hListenSocket, (struct sockaddr *) &cli_addr,&clilen);if (sockfd < 0) {perror("accept");return INVALID_SOCKET;}hDataSocket = sockfd;close(hListenSocket);return sockfd;}int ConnectToServer(char *name, char *port){int s;unsigned int portnum;struct sockaddr_in server;struct hostent *hp;while( name && *name == ' ') name++;if( !name || ! (*name) )return INVALID_SOCKET;portnum = atoi(port);bzero((char *) &server, sizeof(server));if( isdigit(name[0])) {server.sin_family = AF_INET;server.sin_addr.s_addr = inet_addr(name);server.sin_port = htons(portnum);}else{if ( (hp = gethostbyname(name)) == NULL){perror("gethostbyname");return INVALID_SOCKET;}bcopy(hp->h_addr,(char *) &server.sin_addr,hp->h_length);server.sin_family = hp->h_addrtype;server.sin_port = htons(portnum);}if( (s = socket(AF_INET, SOCK_STREAM, 0)) < 1) {perror("socket");return INVALID_SOCKET;}if (connect(s,(struct sockaddr *)&server, sizeof(server))< 0) {perror("connect");return INVALID_SOCKET;}setsockopt(s,SOL_SOCKET,SO_LINGER,0,0);setsockopt(s,SOL_SOCKET,SO_REUSEADDR,0,0);setsockopt(s,SOL_SOCKET,SO_KEEPALIVE,0,0);hDataSocket = s;return s;}int ReadControlMsg( char *szBuffer, int len){int ret;if( (ret=recv(hControlSocket,szBuffer,len,0)) <= 0)return 0;return ret;}int SendControlMsg( char *szBuffer, int len){if( send(hControlSocket,szBuffer,len,0) <= 0)return 0;return 1;}FILE*data_conn(char* lmode){ return (fdopen(hDataSocket,lmode));}int ReadDataMsg( char *szBuffer, int len){int ret;if( (ret=recv(hDataSocket,szBuffer,len,0)) <= 0)return 0;return ret;}int SendDataMsg( char *szBuffer, int len){if( send(hDataSocket,szBuffer,len,0) <= 0)return 0;return 1;}void CloseDataConnection( int hSocket ){close(hSocket);hSocket = INVALID_SOCKET;}void CloseControlConnection( void ){close(hControlSocket);hControlSocket = INVALID_SOCKET;}void CloseListenSocket( void ){close(hListenSocket);hListenSocket = INVALID_SOCKET;}int CheckControlMsg( char *szPtr, int len){return recv(hControlSocket,szPtr,len,MSG_PEEK);}int GetLine(){int done=0, iRetCode =0, iLen, iBuffLen=0;char *szPtr = szBuffer, nCode[3]={0},ch=0;while( (iBuffLen < 1024) &&(CheckControlMsg(&ch,1) > 0) ){iLen = ReadControlMsg(&ch,1);iBuffLen += iLen;*szPtr = ch;szPtr += iLen;if( ch == '\n' )break; }*(szPtr+1) = (char)0;strncpy(nCode, szBuffer, 3);return (atoi(nCode));} int GetReply(){int done = 0, iRetCode = 0;memset(szBuffer,0,1024);DnszBuff[0]='\0';while(!done ) {iRetCode = GetLine();(void)strtok(szBuffer,"\r\n");puts(szBuffer);strcpy(DnszBuff,szBuffer);if( szBuffer[3] != '-' && iRetCode > 0 )done = 1;memset(szBuffer,0,1024);}return iRetCode;}int CheckInput(){int rval, i;fd_set readfds, writefds, exceptfds;struct timeval timeout;FD_ZERO(&readfds);FD_ZERO(&writefds);FD_ZERO(&exceptfds);FD_CLR (fileno(stdin),&readfds);timeout.tv_sec = 0 ; /* 0-second timeout. */timeout.tv_usec = 0 ; /* 0 microseconds. */FD_SET(fileno(stdin),&readfds);i=select ( fileno(stdin)+1,&readfds,&writefds,&exceptfds,&timeout);/* SELECT interrupted by signal - try again. */if (errno == EINTR && i ==-1) {return 0;}return ( FD_ISSET(fileno(stdin),&readfds) );}#if 0int CheckFds( char *command){int rval, i;fd_set readfds, writefds, exceptfds;struct timeval timeout;char *szInput=command;memset(szBuffer,0,1024);FD_ZERO(&readfds);FD_ZERO(&writefds);FD_ZERO(&exceptfds);FD_CLR (fileno(stdin),&readfds);if( hControlSocket > 0)FD_CLR (hControlSocket,&readfds);timeout.tv_sec = 0 ; timeout.tv_usec = 0 ; FD_SET(fileno(stdin),&readfds);if( hControlSocket > 0)FD_SET(hControlSocket,&readfds);i=select ((hControlSocket > 0) ? (hControlSocket+1) : 1,&readfds,&writefds,&exceptfds,&timeout);if (errno == EINTR && i ==-1) {return 0;}if( (hControlSocket > 0) && FD_ISSET(hControlSocket, &readfds) ){if ( ( rval = ReadControlMsg(szBuffer,1024)) > 0){printf(szBuffer);printf("ftp>");fflush(stdout);return 0;}else {printf("\r\nConnection closed by server\r\n");CloseControlConnection();hControlSocket = -1;return 0;}}if( FD_ISSET(fileno(stdin),&readfds) )return (ReadCommand = GetInput(command));return (ReadCommand = 0);}#endif
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -