|
Banned
Регистрация: 16.12.2006
Сообщений: 27
Провел на форуме: 110871
Репутация:
-17
|
|
переполз с дельфи на си...
в качестве первого проекта выбрал "remot acces system" =)
интересно ваше мнение, что можно зделать лучше? как будет быстрее? как будет грамотней с точки зрения си программиста? и пожалуйста почему?(обязательно)
+ предложившему что-то дельное.
Код:
//main module
#include "NetFunc.h"
#include <windows.h>
#pragma comment(linker,"/MERGE:.rdata=.text")
#pragma comment(linker,"/FILEALIGN:512 /SECTION:.text, EWRX /IGNORE:4078")
#pragma comment(linker,"/ENTRY:WinMain")
int StartSession(SOCKET,SOCKADDR_IN);
void ErrorFunc(int Fr)
{
MessageBox(0,"1111","1111",1);
}
int WINAPI WinMain(HINSTANCE,HINSTANCE,LPSTR,int)
{
char chA=0;
int iReset=0;
int iOff=0;
while(!iOff)//Main loop
{
WSADATA sWsaData;
SOCKET hLSock;
long host=INADDR_ANY;
short port=6677;
if(WSAStartup(MAKEWORD(2,0),&sWsaData)!=SOCKET_ERROR)
{
hLSock = socket(AF_INET,SOCK_STREAM,0);
if(hLSock!=INVALID_SOCKET)
{
SOCKADDR_IN addr_Sock;
addr_Sock.sin_family = AF_INET;
addr_Sock.sin_addr.s_addr = htonl(INADDR_ANY);
addr_Sock.sin_port = htons(port);
if(bind(hLSock,(LPSOCKADDR)&addr_Sock,sizeof(addr_Sock))!=SOCKET_ERROR)
{
if (listen(hLSock,1)!=SOCKET_ERROR)
{
while(!iReset)//Accept loop
{
int size=sizeof(addr_Sock);
SOCKET hWSock= accept(hLSock,(LPSOCKADDR)&addr_Sock,&size);
if(hWSock!=INVALID_SOCKET)
{
int i=StartSession(hWSock,addr_Sock);
if(!i)iReset=1;
if(i<0) iOff=1;
}
else//accept
{
ErrorFunc(5);
}
shutdown(hWSock,0);
closesocket(hWSock);
}//Accept loop
}
else//listen
{
ErrorFunc(4);
}
}
else//bind
{
ErrorFunc(3);
}
shutdown(hLSock,1);
closesocket(hLSock);
}
else//Creat listen sock
{
ErrorFunc(2);
}
WSACleanup();
}
else//WSAStartup
{
ErrorFunc(1);
}
Sleep(2000);
}//Main loop
return 0;
}
Код:
//NetFunc.cpp
#include <winsock2.h>
#define SOCK_TOUT 5000000;
/////////////////////////////////////////////Send data
int SendData(SOCKET hSock, char *pBuffer, int len)
{
/////Encrypt
/////
int ts=0;
int ss=0;
timeval SendTimeout;
fd_set fds;
FD_ZERO(&fds);
FD_SET(hSock, &fds);
SendTimeout.tv_sec=0;
SendTimeout.tv_usec=SOCK_TOUT;
while(len > 0)
{
ts = select(0, NULL, &fds, NULL, &SendTimeout);
if(!ts) return -1;//time out
if(ts < 0) return -2;//sel error
ss = send(hSock, pBuffer, len, 0);
if(ss < 0)
return -3;//send error
else
{
len -= ss;
pBuffer += ss;
}
}
return 0;//ok
}
////////////////////////////////////////////Recv data
int RecvData(SOCKET hSock, char *pBuffer, int len)
{
int ts=0;
int rs=0;
timeval ReceiveTimeout;
fd_set fds;
FD_ZERO(&fds);
FD_SET(hSock, &fds);
ReceiveTimeout.tv_sec = 0;
ReceiveTimeout.tv_usec = SOCK_TOUT;
while(len > 0)
{
ts = select(0, &fds, NULL, NULL, &ReceiveTimeout);
if(!ts) return -1;//time out
if(ts<0) return -2;//sel error
rs = recv(hSock, pBuffer, len, 0);
if(rs < 0)
{
return -3;//recv error
}
else
{
len -= rs;
pBuffer += rs;
}
}
/////Decrypt
/////
return 0;//ok
}
////////////////////////////////////////////
Код:
//executer.cpp
#include "NetFunc.h"
#include <windows.h>
int StartSession(SOCKET hSock,SOCKADDR_IN addr_Sock)
{
char Buff[4];
char szCom[3];
char szSubCom[3];
//ident
//logon
//exec. comands
while(1)
{
if (recv(hSock,&Buff[0],sizeof(Buff[0]),MSG_PEEK)<=0) return WSAGetLastError();
if (RecvData(hSock,&Buff[0],sizeof(Buff))!=0) return WSAGetLastError();
//analyze comand
for(int i=0;sizeof(Buff)-1;i++)
{
if(i<2)szCom[i]=Buff[i];
else szSubCom[i-2]=Buff[i];
}
szCom[3]=0;
szSubCom[3]=0;
switch(atoi(szCom))
{
case 0:break;
case 1:break;
case 2:break;
default: return 1;
}
//analyze comand
if (SendData(hSock,&Buff[0],sizeof(Buff))!=0) return WSAGetLastError();
}
return 0;
}
Последний раз редактировалось X-lord; 01.08.2007 в 15:28..
|