我所在的单位为了限制员工上互联网,常常使用一些网络监控代理软件来进行控制,如几十人只允许一台公用机器可以上互联网等等.为此,我写了个软件放在那台公用机器上,使其控制形同虚设.我把这个程序发表出来,让大家共享.
#include "stdafx.h"
#include <Winsock2.h>
#pragma comment(lib,"Ws2_32.lib")
#include <share.h>
void Proc();
DWORD WINAPI Server(LPVOID pParam);
DWORD WINAPI Acce(LPVOID pParam);
DWORD WINAPI Thread(LPVOID pParam);
int GetAddressAndPort( char * str, char *address, int * port);
HANDLE hSemaphore;
CRITICAL_SECTION CriticalSection;
int _tmain(int argc, _TCHAR* argv[])
{
Proc();
return 0;
}
void Proc()
{
hSemaphore = CreateSemaphore(NULL,20,20,NULL);
InitializeCriticalSection(&CriticalSection);
WSADATA wsaData;
if(WSAStartup(MAKEWORD(2,2),&wsaData) != 0)
printf("WSAStartup failed!/n");
else
printf("WSAStartup ok!/n");
DWORD id;
HANDLE handle = CreateThread(0,0,(LPTHREAD_START_ROUTINE)Server,NULL,0,&id);
WaitForSingleObject(handle,INFINITE);
CloseHandle(hSemaphore);
DeleteCriticalSection(&CriticalSection);
}
DWORD WINAPI Server(LPVOID pParam)
{
int ret = 0;
SOCKET lsock;
DWORD id;
struct sockaddr_in server;
struct hostent *host = NULL;
lsock = socket(AF_INET,SOCK_STREAM,IPPROTO_TCP);
server.sin_family = AF_INET;
server.sin_port = htons(5001);
server.sin_addr.s_addr = inet_addr("10.180.51.28");
// server.sin_addr.s_addr = htonl(INADDR_ANY);
ret = bind(lsock,(SOCKADDR*)&server,sizeof(server));
if(ret == SOCKET_ERROR)
{
printf("bind fail/n");
return 0;
}
ret = listen(lsock,10);
if(ret == SOCKET_ERROR)
{
printf("listen fail/n");
return 0;
}
HANDLE handle = NULL;
handle = CreateThread(0,0,(LPTHREAD_START_ROUTINE)Acce,(LPVOID)lsock,0,&id);
WaitForSingleObject(handle,INFINITE);
// TerminateThread(handle,0);
// shutdown(lsock,SD_BOTH);
closesocket(lsock);
CloseHandle(handle);
return 0;
}
DWORD WINAPI Acce(LPVOID pParam)
{
HANDLE handle = NULL;
DWORD id;
SOCKADDR_IN client;
int addlen = sizeof(SOCKADDR_IN);
SOCKET lsock = (SOCKET)pParam;
while(1)
{
SOCKET csock;
csock = accept(lsock,(SOCKADDR*)&client,&addlen);
if(csock == INVALID_SOCKET)
{
printf("accept failed/n");
break;
// return 0;
}
else
{
WaitForSingleObject( hSemaphore, INFINITE );
handle = CreateThread(0,0,(LPTHREAD_START_ROUTINE)Thread,(LPVOID)csock,0,&id);
if (handle == NULL)
{
printf("CreateThread() failed: %d/n", GetLastError());
break;
}
CloseHandle(handle);
}
}
return 0;
}
DWORD WINAPI Thread(LPVOID pParam)
{
long dwSemCount = 0; // printing semaphore count
SOCKET psock = (SOCKET)pParam;
struct sockaddr_in name;
int len = sizeof(sockaddr_in);
getpeername(psock,(struct sockaddr*)&name,&len);
struct hostent *host;
host = gethostbyaddr((char *)&name.sin_addr.S_un.S_addr,sizeof(name.sin_addr.S_un.S_addr), AF_INET);
char hostname[512];
memset(hostname,0,sizeof(hostname));
if(host == NULL)
{
printf("host == NULL/n");
closesocket(psock);
ReleaseSemaphore(hSemaphore, 1, &dwSemCount );
return 0;
}
strcpy(hostname,host->h_name);
EnterCriticalSection(&CriticalSection);
CString ip,str;
char ch[20];
ip.Format("%s",inet_ntoa(name.sin_addr));
printf("%s %s/n",ip,hostname);
FILE* fp;
fp = _fsopen("ip.txt","r",_SH_DENYRD );
if(fp == NULL)
{
fclose(fp);
closesocket(psock);
ReleaseSemaphore(hSemaphore, 1, &dwSemCount );
LeaveCriticalSection(&CriticalSection);
return 0;
}
BOOL find = FALSE;
while(fgets(ch,sizeof(ch),fp))
{
str.Format("%s",ch);
str = str.Left(str.GetLength() - 1);
if(str == ip)
{
find = TRUE;
break;
}
memset(ch,0,sizeof(ch));
}
if(find == FALSE)
{
char mess[1024];
memset(mess,0,sizeof(mess));
FILE* htm;
htm = _fsopen("Hello.htm","r",_SH_DENYRD );
if(htm == NULL)
{
fclose(htm);
closesocket(psock);
ReleaseSemaphore(hSemaphore, 1, &dwSemCount );
LeaveCriticalSection(&CriticalSection);
return 0;
}
int i = 0;
while(!feof(htm))
{
mess[i] = fgetc(htm);
i ++;
}
send(psock,mess,sizeof(mess),0);
fclose(htm);
closesocket(psock);
ReleaseSemaphore(hSemaphore, 1, &dwSemCount );
LeaveCriticalSection(&CriticalSection);
return 0;
}
fclose(fp);
LeaveCriticalSection(&CriticalSection);
SOCKET conn_socket = socket(AF_INET,SOCK_STREAM,0); /* 打开一个 socket */
struct sockaddr_in client;
client.sin_family = AF_INET;
unsigned short cport = 7080;
client.sin_port = htons(cport);
client.sin_addr.s_addr = inet_addr("10.180.53.187");
if (connect(conn_socket,(struct sockaddr*)&client,sizeof(client)) == SOCKET_ERROR)
{
printf("conn_socket connect failed/n");
closesocket(conn_socket);
closesocket(psock);
ReleaseSemaphore(hSemaphore, 1, &dwSemCount );
return 0;
}
int a = 0;
int ret;
char rec[4096];
while(1)
{
memset(rec,0,sizeof(rec));
ret = recv(psock,rec,sizeof(rec),0);
if(ret == SOCKET_ERROR)
{
closesocket(conn_socket);
closesocket(psock);
ReleaseSemaphore(hSemaphore, 1, &dwSemCount );
return 0;
}
if(ret == 0)
{
closesocket(conn_socket);
closesocket(psock);
ReleaseSemaphore(hSemaphore, 1, &dwSemCount );
return 0;
}
/* a = a + 1;
if(a == 1)
{
EnterCriticalSection(&CriticalSection);
char address[256];
memset(address,0,sizeof(address));
int port = 0;
GetAddressAndPort(rec,address,&port);
printf("%s %s address:%s port:%d/n",ip,hostname,address,port);
ReleaseSemaphore(hSemaphore, 1, &dwSemCount );
}
*//* char address[256];
memset(address,0,sizeof(address));
int port = 0;
GetAddressAndPort(rec,address,&port);
char* p = strstr(address,":");
if(p)
{
p = p + 1;
port = atoi(p);
address[p-1-address] = '/0';
}
printf("address:%s port:%d/n",address,port);
struct sockaddr_in server;
unsigned int addr;
struct hostent *hp;
/* if(isdigit(address[0]))
{
printf("address isdigit %s/n",address);
closesocket(psock);
//delete pa;
return 0;
}
*//* if (isalpha(address[0]))
{
hp = gethostbyname(address);
if(hp == NULL)
{
printf("gethostbyname failed %s/n",address);
closesocket(psock);
//delete pa;
return 0;
}
}
else
{
addr = inet_addr(address);
hp = gethostbyaddr((char *)&addr,4,AF_INET);
if(hp == NULL)
{
printf("gethostbyaddr failed %s/n",address);
closesocket(psock);
//delete pa;
return 0;
}
}
memset(&server,0,sizeof(server));
memcpy(&(server.sin_addr),hp->h_addr,hp->h_length);
server.sin_family = hp->h_addrtype;
server.sin_port = htons(port);
*/
ret = send(conn_socket,rec,ret,0);
if(ret == SOCKET_ERROR)
{
closesocket(conn_socket);
closesocket(psock);
ReleaseSemaphore(hSemaphore, 1, &dwSemCount );
return 0;
}
if(ret == 0)
{
closesocket(conn_socket);
closesocket(psock);
ReleaseSemaphore(hSemaphore, 1, &dwSemCount );
return 0;
}
if(ret < 4096)
break;
}
char recc[4096];
int nLeft,idx;
while(1)
{
ret = 0;
memset(recc,0,sizeof(recc));
ret = recv(conn_socket,recc,sizeof(recc),0);
if(ret == SOCKET_ERROR)
{
break;
}
if(ret == 0)
{
break;
}
nLeft = ret;
idx = 0;
ret = send(psock,recc,ret,0);
if(ret == SOCKET_ERROR)
{
break;
}
if(ret == 0)
{
break;
}
}
// shutdown(conn_socket,SD_BOTH);
// shutdown(psock,SD_BOTH);
closesocket(conn_socket);
closesocket(psock);
ReleaseSemaphore(hSemaphore, 1, &dwSemCount );
return 0;
}
int GetAddressAndPort( char * str, char *address, int * port)
{
char buf[1024], command[512], proto[128], *p;
int j;
sscanf(str,"%s%s%s",command,buf,proto);
p=strstr(buf,"http://");
//HTTP
if(p)
{
p+=strlen("http://");
for(int i=0;i< strlen(p);i++)
if( *(p+i)=='/') break;
*(p+i)=0;
strcpy(address,p);
/* p=strstr(str,"http://");
for(int j=0;j< i+strlen("http://");j++)
//去掉远程主机名:
//GET http://www.njust.edu.cn/ HTTP1.1 == > GET / HTTP1.1
*(p+j)=' ';
*/ *port=80; //缺省的 http 端口
}
/* else
{
//FTP, 不支持, 下面的代码可以省略.
p=strstr(buf,"ftp://");
if(!p) return 0;
p+=strlen("ftp://");
for(int i=0;i< strlen(p);i++)
if( *(p+i)=='/') break; //Get The Remote Host
*(p+i)=0;
for(j=0;j< strlen(p);j++)
if(*(p+j)==':')
{
*port=atoi(p+j+1); //Get The Port
*(p+j)=0;
}
else *port=21;
strcpy(address,p);
p=strstr(str,"ftp://");
for(j=0;j< i+strlen("ftp://");j++)
*(p+j)=' ';
}
*/ return 1;
}