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

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

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

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
2.2功能描述 本软件为协议转换软件,从OPC server端获取数据,然后通过协议转换成Modbus server端及FMTCP Server端,供第三方设备或系统进行访问,支持Modbus RTU模式和Modbus TCP模式。 2.3应用场景 场景一:目前大多数现场控制系统(DCS)都提供OPC server接口,但是为了安全起见,很多生产型企业的OPC服务器禁止外部的设备或系统通过TCP方式接入,对外只提供串口。在这种情况下,可以在OPC服务器上部署Opcquickclient软件,通过在本地将OPC协议转换成Modbus RTU协议映射到相应的串口,就很方便的供第三方硬件或系统进行访问。 场景二:Opcquickclient软件可以用来解决远程访问OPC服务器遇到的DCOM配置问题(远程OPC缺点:通讯不稳定,DCOM配置麻烦,不利于维护)。在OPC服务器运行的电脑上安装Opcquickclient软件后,通过此软件读取OPC服务器并转换成Modbus服务器,这样其它电脑仅仅通过访问Modbus服务器,就可以实现监视和控制(读写OPC服务器),习惯使用OPC的客户可以使用免费的软件OPCRemote.exe在远程计算机还原成OPC通讯方式。 场景三:可以让Linux平台的设备(如某些工业触摸屏)或者不带操作系统的设备(如PLC)通过Modbus协议可以访问PC上的OPC服务器,从而实现系统集成。 本软件优点:可配置性强,操作简单,稳定可靠。在OPC服务器意外关闭的时候,该软件能够使OPC服务器自动运行起来,方便用户操作。 2.4应用领域  解决工业触摸屏访问OPC服务器;  解决不带Windows操作系统的控制器访问OPC服务器,如Linux OS 电脑、PLC、DCS等;  解决访问Citect、IFIX、RSVIEW、WINCC、组态王、易控等组态软件远程OPC服务器的问题;  等等……

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值