Code:
#include<windows.h>
#include<stdio.h>
#include<wininet.h>
#include<sys/types.h>
#include<sys/stat.h>
#define MAX_CLIENTS (0x100)
#define MAX_TEXT (0x1000)
#define sendString(sock,a) send(sock,a,strchr(a,'\n')-a+1,0)
char*MY_IP;
DWORD WINAPI ftpThreadProc(SOCKET mySocket)
{
char a[MAX_TEXT],b[MAX_TEXT],c[MAX_TEXT],directory[MAX_TEXT],userName[MAX_TEXT];
long x,y;
FILE*file;
sockaddr_in service;
service.sin_family=AF_INET;
service.sin_addr.s_addr=inet_addr(MY_IP);
service.sin_port=htons(INTERNET_DEFAULT_FTP_PORT);
strcpy(directory,"/");
printf("%X\n",mySocket);
sendString(mySocket,"220 This is the FTP server.\n");
for(;;)
{
recv(mySocket,a,MAX_TEXT,0);
*strchr(a,'\n')=0;
puts(a);
sscanf(a,"%s %s",c,b);
if(!(stricmp(c,"PWD")&&stricmp(c,"XPWD")))
{
sprintf(a,"257 %s\n",directory);
sendString(mySocket,a);
}
else if(!stricmp(c,"USER"))
{
strcpy(userName,b);
sprintf(a,"230 Login successful, %s.\n",userName);
sendString(mySocket,a);
}
else if(!stricmp(c,"LIST"))
{
if(!*b)
{
SOCKET dataSocket=socket(AF_INET,SOCK_STREAM,IPPROTO_TCP);
sendString(mySocket,"150 Opening data connection\n");
connect(dataSocket,(SOCKADDR*)&service,sizeof(service));
sendString(dataSocket,"This is a file.\n");
closesocket(dataSocket);
sendString(mySocket,"226 Closing data connection\n");
}
}
else if(!stricmp(c,"PORT"))
{
sscanf(b,"%n,%n,%n,%n,%n,%n",&service.sin_addr.s_addr,&service.sin_addr.s_addr+1,&service.sin_addr.s_addr+2,&service.sin_addr.s_addr+3,&service.sin_port,&service.sin_port+1);
}
else
{
sprintf(a,"502 Like I'd implement %s.\n",c);
sendString(mySocket,a);
}
}
return 0;
}
DWORD WINAPI createFTPThreadsThreadProc(void*theVoid)
{
SOCKET lSock;
sockaddr_in service;
service.sin_family=AF_INET;
service.sin_port=htons(INTERNET_DEFAULT_FTP_PORT);
service.sin_addr.s_addr=inet_addr(MY_IP);
lSock=socket(AF_INET,SOCK_STREAM,IPPROTO_TCP);
bind(lSock,(SOCKADDR*)&service,sizeof(service));
listen(lSock,MAX_CLIENTS);
for(;;)
CreateThread(NULL,0,(LPTHREAD_START_ROUTINE)ftpThreadProc,(void*)accept(lSock,NULL,NULL),0,NULL);
return 0;
}
DWORD WINAPI httpThreadProc(SOCKET mySocket)
{
char a[MAX_TEXT],b[MAX_TEXT],c[MAX_TEXT];
FILE*file;
int x;
recv(mySocket,a,MAX_TEXT,0);
printf("%s",a);
sscanf(a,"%s %s",c,b);
if(!stricmp(c,"GET"))
{
strcpy(c,"webFiles");
if(b[strlen(b)-1]=='/')
strcat(b,"index.html");
file=fopen(strcat(c,b),"rb");
if(!file)
{
strcpy(b,"webFiles/notFound.html");
file=fopen("webFiles/notFound.html","rb");
}
x=fread(c,1,MAX_TEXT,file);
fclose(file);
ZeroMemory(a,0x200);
if(!strcmp(strrchr(b,'.')+1,"html"))
{
sprintf(a,"HTTP/1.1 200 OK\n\n<html><title>madmardigan53</title><body><font face=\"Courier New\">%s</font><body><html>",c);
x=strlen(a);
}
else
{
strcpy(a,"HTTP/1.1 200 OK\n\n");
x+=strlen(a);
printf("%X\n",x);
memcpy(a+strlen(a),c,x-strlen(a));
}
send(mySocket,a,max(x,0x200),0);
}
closesocket(mySocket);
return 0;
}
int main(int argc,char**argv)
{
MY_IP=argv[1];
WSAData wsaData;
WSAStartup(MAKEWORD(2,2),&wsaData);
CreateThread(NULL,0,createFTPThreadsThreadProc,NULL,0,NULL);
SOCKET lSock;
sockaddr_in service;
service.sin_family=AF_INET;
service.sin_port=htons(INTERNET_DEFAULT_HTTP_PORT);
service.sin_addr.s_addr=inet_addr(MY_IP);
lSock=socket(AF_INET,SOCK_STREAM,IPPROTO_TCP);
bind(lSock,(SOCKADDR*)&service,sizeof(service));
listen(lSock,MAX_CLIENTS);
for(;;)
CreateThread(NULL,0,(LPTHREAD_START_ROUTINE)httpThreadProc,(void*)accept(lSock,NULL,NULL),0,NULL);
}