| 01 |
LINUX CLIENT/SERVER
|
| 02 |
SERVER/CLIENT UNIX
|
#include "stdafx.h"
#include "MTServer.h"
#ifdef _DEBUG
#define new DEBUG_NEW
#undef THIS_FILE
static char THIS_FILE[] = __FILE__;
#endif
CWinApp theApp;
SOCKET server,client;
char buff[512];
using namespace std;
UINT MTServerThread(LPVOID pParam);
UINT ClientThread(LPVOID pParam);
BOOL ParseCmd(char *str, CString& cmd, CString& params);
BOOL SendFile(SOCKET s, CString fname);
int _tmain(int argc, TCHAR* argv[], TCHAR* envp[])
{
int nRetCode = 0;
cout << "Press ESCAPE to terminate programrn";
AfxBeginThread(MTServerThread,0);
while(_getch()!=27);
closesocket(server);
WSACleanup();
return nRetCode;
}
UINT MTServerThread(LPVOID pParam)
{
WSADATA wsaData;
sockaddr_in local;
cout << "Initializing Winsockrn";
int wsaret=WSAStartup(0x101,&wsaData);
if(wsaret!=0)
{
cout << "Error in Winsock!rn";
return 0;
}
local.sin_family=AF_INET;
local.sin_addr.s_addr=INADDR_ANY;
local.sin_port=htons((u_short)20248);
cout << "Constructing server socketrn";
server=socket(AF_INET,SOCK_STREAM,0);
if(server==INVALID_SOCKET)
{
cout << "Error in server socketrn";
return 0;
}
cout << "Binding...rn";
if(bind(server,(sockaddr*)&local,sizeof(local))!=0)
{
cout << "Error in bind...rn";
return 0;
}
cout << "Listening...rn";
if(listen(server,10)!=0)
{
cout << "Error in listen...rn";
return 0;
}
SOCKET client;
sockaddr_in from;
int fromlen=sizeof(from);
while(true)
{cout << "Accepting client connections...rn";
client=accept(server,
(struct sockaddr*)&from,&fromlen);
cout << "Connection from:"<
AfxBeginThread(ClientThread,(LPVOID)client);
}
return 0;
}
UINT ClientThread(LPVOID pParam)
{
char buff[512];
CString cmd;
CString params;
int n;
BOOL auth=false;
cout << "Constructing client socket...rn";
SOCKET client=(SOCKET)pParam;
cout << "Sending greeting to client...rn";
strcpy(buff,"#Server Ready.rn");
send(client,buff,strlen(buff),0);
while(true)
{ cout << "Receiving user input:...rn";
n=recv(client,buff,512,0);
if(n==SOCKET_ERROR )
break;
buff[n]=0;
if(ParseCmd(buff,cmd,params))
{
if(cmd=="QUIT"){cout << "Quiting....rn";break;}
if(cmd=="LIST"){
strcpy(buff,"LISTING DIRECTORIES...rn");//INITIALIZE
send(client,buff,512,0);
CFileFind finder;
BOOL bWorking = finder.FindFile(params+"*.*");
while (bWorking)
{
bWorking = finder.FindNextFile();
if (finder.IsDots()) continue;
if (finder.IsDirectory())
{
CString dir = finder.GetFilePath();
cout << (LPCTSTR) dir << endl;
strcpy(buff,dir+"rn");
}
else {CString f_name = finder.GetFileName();
cout << (LPCTSTR) f_name << endl;
strcpy(buff,f_name+"rn");
}
send(client,buff,512,0);
}
finder.Close();
// Recurse(_T(params));
/* CFileFind finder;
BOOL bWorking = finder.FindFile("*.*");
while (bWorking)
{
bWorking = finder.FindNextFile();
cout << (LPCTSTR) finder.GetFileName() << endl;
strcpy(buff, finder.GetFileName()+"rn");
send(client,buff,strlen(buff),0);
}
*/
strcpy(buff, "#Endrn");
send(client,buff,strlen(buff),0);
}
if(cmd=="AUTH")
{
if(params=="passwd")
{
auth=true;
strcpy(buff,"#You are logged in.rn");
}
else
{
strcpy(buff,"!Bad password.rn");
}
send(client,buff,strlen(buff),0);
}
if(cmd=="FILE")
{
cout << "File send operation!!!...rn";
if(auth)
{
if(SendFile(client,params)){cout << "Sending file...rn";
sprintf(buff,"#File %s sent successfully.rn",params);}
else {sprintf(buff,"!File %s could not be opened.rn",params);}
send(client,buff,strlen(buff),0);
}
else
{
strcpy(buff,"!You are not logged in.rn");
send(client,buff,strlen(buff),0);
}
}
}//parsecmd end
else
{
strcpy(buff,"!Invalid command.rn");
send(client,buff,strlen(buff),0);
}
}
cout << "Closing connection...rn";
closesocket(client);
return 0;
}
BOOL ParseCmd(char *str, CString& cmd, CString& params)
{
int n;
CString tmp=str;
tmp.TrimLeft();
tmp.TrimRight();
if((n=tmp.Find(' '))==-1)
{
tmp.MakeUpper();
if(tmp!="QUIT")
return false;
cmd=tmp;
return true;
}
cmd=tmp.Left(n);
params=tmp.Mid(n+1);
cmd.MakeUpper();
// if((cmd!="AUTH") && (cmd!="FILE"))
// return false;
return true;
}
BOOL SendFile(SOCKET s, CString fname)
{
CFile f;
BOOL p=f.Open(fname,CFile::modeRead);
cout << "Opening file...rn";
char buff[512];
int y;
int x;
if(!p)
return false;
while(true)
{
y=f.Read(buff,512);
cout << "Read-Sendrn";
x=send(s,buff,y,0);
if(y<512)
{
f.Close();
break;
}
}
return true;
}
от Невян Нейков