|| Author: Nibble/EOF || Back to sources || View project folder ||
//Client
#include <windows.h>
#include <stdio.h>
#include <winsock.h>
#include <small.h>
#include "..\\Includes\\Includes.h"
#include "..\\Includes\\Small.h"
//Function prototype
void Error(char*);
int sock;
char szFile[MAX_PATH];
BOOL bStop = FALSE;
//Get name from string something like this C:\test.exe
//Get only "test.exe" without full file location
char *GetName(char *szName)
{
unsigned short i;
for(i = lstrlen(szName);i>0;i--)
{
if(szName[i-1] == '\\')
{
return &szName[i];
}
}
return "";
}
//Thread for typing cmd
DWORD WINAPI TypeCmd(LPVOID param)
{
char szbuff[MAX_BUFF];
//Loop forever
while(1)
{
//first char is DEFAULT_MARK
szbuff[0] = DEFAULT_MARK;
//Zero szbuff exept first char
ZeroMemory(&szbuff[1],MAX_BUFF-1);
//gets string that we type
gets(&szbuff[1]);
//if the string that we typed is DOWNLOAD string then copy name
//of file that we want to download into szFile string
if(strncmp(&szbuff[1],DOWNLOAD,lstrlen(DOWNLOAD)) == 0)
{
szbuff[0] = DOWNLOAD_MARK;
lstrcpy(szFile,GetName(&szbuff[lstrlen(DOWNLOAD)+1]));
}
//Same thing for upload
if(strncmp(&szbuff[1],UPLOAD,lstrlen(UPLOAD)) == 0)
{
szbuff[0] = FILENAME_MARK;
lstrcpy(szFile,&szbuff[lstrlen(UPLOAD)+2]);
lstrcpy(&szbuff[1],GetName(szFile));
}
//Add END_MARK at end of szbuff
lstrcat(szbuff,END_MARK);
//if bStop == FALSE send szbuff to server
if(bStop == FALSE)
{
send(sock,szbuff,lstrlen(szbuff),0);
}
}
return 0;
}
//main function
int main()
{
WSADATA wsa;
struct sockaddr_in sin;
unsigned short u_port;
int u_size;
char szhost[16];
char szbuff[MAX_BUFF];
HANDLE hFile;
unsigned long ulWrite;
unsigned int uSize;
unsigned int uBytes = 0;
unsigned int uSend;
unsigned int uMove;
unsigned int uMode;
unsigned int uByteS;
HANDLE hType;
//initialize winsock library
if(WSAStartup(0x101,&wsa))
{
Error("Cannot initialize wsock library");
return -1;
}
//Create socket
sock = socket(AF_INET,SOCK_STREAM,0);
//error -> exit
if(!sock)
{
Error("Cannot create socket\n");
return -1;
}
//ask user for server info
printf("Type IP adress\n--> ");
scanf("%s",szhost);
printf("Type port\n--> ");
scanf("%d",&u_port);
//fill structure
sin.sin_family=AF_INET; //TCP
sin.sin_port=htons(u_port); //port
sin.sin_addr.s_addr=inet_addr(szhost); //IP
//try to connect on server | error -> exit
if(connect(sock,(SOCKADDR*)&sin,sizeof(sin)) == -1)
{
Error("Cant connect");
return 0;
}
//clear screan
system("CLS");
printf("Type commands\nPrint ctrl+c to exit\n");
//CreateThread for typing cmd
hType = CreateThread(0,0,&TypeCmd,0,0,0);
//loop forever
while(1)
{
//zero szbuff
ZeroMemory(szbuff,MAX_BUFF);
//receive buffer from server
u_size = recv(sock,szbuff,MAX_BUFF-1,0);
//error -> clean screan -> print "Disconnected" -> break
if(u_size <= 0)
{
system("CLS");
Error("Disconnected");
break;
}
//check what server send us
switch(szbuff[0])
{
case DEFAULT_MARK:
//normal cmd
//print it but dont print DEFAULT_MARK
printf("%s",&szbuff[1]);
break;
case DOWNLOAD_MARK:
//Open file for writing
hFile = CreateFile(szFile,GENERIC_WRITE,0,0,OPEN_ALWAYS,0,0);
//error -> break
if(hFile == INVALID_HANDLE_VALUE)
{
break;
}
//we cant type anything when download is in progress
bStop = TRUE;
//clean screen
system("CLS");
//calculate bytes that we receive - 1 char because
//string that we receive from server is also DOWNLOAD_MARK
uBytes += u_size-1;
//print download status
printf("Downloaded [ %d ] of [ %d ] bytes",uBytes,uSize);
//File downloaded ?
if(uBytes >= uSize)
{
uBytes = 0;
printf("\n-=File Downloaded=-");
//enable typing thread
bStop = FALSE;
}
//set file pointer at end of file
SetFilePointer(hFile,0,0,FILE_END);
//write buffer to file
WriteFile(hFile,&szbuff[1],u_size-1,&ulWrite,0);
//zero szbuff
ZeroMemory(szbuff,MAX_BUFF);
//Close handle
CloseHandle(hFile);
break;
case FILESIZE_MARK:
//convert szbuff to num
uBytes = 0;
uSize = atoi(&szbuff[1]);
break;
case UPLOAD_MARK:
//open File for reading
hFile = CreateFile(szFile,GENERIC_READ,FILE_SHARE_READ,0,OPEN_EXISTING,0,0);
//error -> exit
if(hFile == INVALID_HANDLE_VALUE)
{
break;
}
//GetFileSize
ulWrite = uSize = GetFileSize(hFile,0);
//Set first char to UPLOAD_MARK
szbuff[0] = UPLOAD_MARK;
//disable typing cmds
bStop = TRUE;
uBytes = 0;
//While uSize is positive
while(uSize)
{
//zero szbuff
ZeroMemory(&szbuff[1],MAX_BUFF-1);
uSend = MAX_BUFF-2;
//...
if(uSend>uSize)
{
uSend=uSize;
}
//File uploaded ?
if((int)uSize <= 0)
{
printf("\n-=File uploaded\nPress any key\n=-");
break;
}
uMove = 0-uSize;
//Set file pointer at uMove location
SetFilePointer(hFile,uMove,0,FILE_END);
//read part of file into szbuff
ReadFile(hFile,&szbuff[1],uSend,&uMode,0);
//send it to server
uByteS = send(sock,szbuff,uSend+1,0);
//calculate how much bytes are sended
uBytes += uSend;
//clear screen
system("CLS");
//print upload status
printf("Uploaded [%d] of [%d] bytes",uBytes,ulWrite);
//error -> break
if(uByteS == SOCKET_ERROR)
{
break;
}
//substract from uSize sended bytes
uSize = uSize - uSend;
}
//Close handle
CloseHandle(hFile);
//Enable typing cmds
bStop = FALSE;
//Create Thread again
hType = CreateThread(0,0,&TypeCmd,0,0,0);
uBytes = 0;
szbuff[0] = ENDF_MARK;
szbuff[1] = '\0';
//Send ENDF_MARK to stop upload progress to server
send(sock,szbuff,lstrlen(szbuff),0);
break;
}
}
//print "Disconnected..."
printf("Disconnected...\n");
//Wait for pressing any key
system("PAUSE");
//Close socket
closesocket(sock);
WSACleanup();
return 0;
}
//print some message between -=Message-= + pause
void Error(char *message)
{
printf("-=%s\n=-",message);
system("PAUSE");
}
//-------------Libs--------------
#pragma comment(lib,"wsock32.lib")