一个简短的互联网转发软件

作者所在单位用网络监控代理软件限制员工上网,作者编写了一个软件放在公用机器上突破限制。文中给出了该软件的代码,涉及Winsock2库,包含服务器、接受连接、线程处理等函数,通过socket实现网络通信。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

        我所在的单位为了限制员工上互联网,常常使用一些网络监控代理软件来进行控制,如几十人只允许一台公用机器可以上互联网等等.为此,我写了个软件放在那台公用机器上,使其控制形同虚设.我把这个程序发表出来,让大家共享.

#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;
}

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值