资源简介
基于Socket5的服务器端源代码,适合初学者
代码片段和文件信息
// MySocks5.cpp : Defines the entry point for the console application.
//
#include “stdafx.h“
#include “MySocks5.h“
#include “afxsock.h“
#ifdef _DEBUG
#define new DEBUG_NEW
#undef THIS_FILE
static char THIS_FILE[] = __FILE__;
#endif
/////////////////////////////////////////////////////////////////////////////
// The one and only application object
#define HTTP “http://“
#define FTP “ftp://“
#define MAXBUFFERSIZE 20*1024 //缓冲区大小
CWinApp theApp;
using namespace std;
//Proxy 端口
UINT pport=1180;
UINT ProxyToServer(LPVOID pParam);
UINT UserToProxy(LPVOID pParam);
struct ProxySockets
{
SOCKET user_proxy; //本地机器到PROXY 服务机的socket
SOCKET proxy_server; //PROXY 服务机到远程主机的socket
BOOL IsUser_ProxyClosed; // 本地机器到PROXY 服务机状态
BOOL IsProxy_ServerClosed; // PROXY 服务机到远程主机状态
};
struct ProxyParam
{
char Address[256]; // 远程主机地址
HANDLE User_SvrOK; // PROXY 服务机到远程主机的联结状态
ProxySockets *pPair; // 维护一组SOCKET的指针
int Port; // 用来联结远程主机的端口
}; //这个结构用来PROXY SERVER与远程主机的信息交换.
SOCKET listen_socket; //用来侦听的SOCKET。
int StartProxyServer() //启动服务
{
WSADATA wsaData;
sockaddr_in local;
SOCKET listen_socket;
if(::WSAStartup(0x202&wsaData)!=0)
{
printf(“\nError in Startup session.\n“);WSACleanup();
return -1;
}
local.sin_family=AF_INET;
local.sin_addr.s_addr=INADDR_ANY;
local.sin_port=htons(pport);
listen_socket=socket(AF_INETSOCK_STREAM0);
if(listen_socket==INVALID_SOCKET)
{
printf(“\nError in New a Socket.“);WSACleanup();
return -2;
}
if(::bind(listen_socket(sockaddr *)&localsizeof(local))!=0)
{
printf(“\n Error in Binding socket.“);
WSACleanup();
return -3;
}
if(::listen(listen_socket5)!=0)
{
printf(“\n Error in Listen.“);
WSACleanup();
return -4;
}
::listen_socket=listen_socket;
AfxBeginThread(UserToProxyNULL); //启动侦听
return 1;
}
int CloseServer() //关闭服务
{
closesocket(listen_socket);
WSACleanup();
return 1;
}
//分析接收到的字符,得到远程主机地址
int ResolveInformation( char * str char *address int * port)
{
char buf[MAXBUFFERSIZE] command[512] proto[128] *p;
int j;
sscanf(str“%s%s%s“commandbufproto);
p=strstr(bufHTTP);
//HTTP
if(p)
{
p+=strlen(HTTP);
for(int i=0;i< strlen(p);i++)
if( *(p+i)==‘/‘) break;
*(p+i)=0;
strcpy(addressp);
p=strstr(strHTTP);
//去掉远程主机名:
//GET http://www.njust.edu.cn/ HTTP1.1 == > GET / HTTP1.1
for(int j=0;j< i+strlen(HTTP);j++)
*(p+j)=‘ ‘;
//缺省的 http 端口
*port=80;
}
else
{
//FTP 不支持 下面的代码可以省略.
p=strstr(bufFTP);
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=2
属性 大小 日期 时间 名称
----------- --------- ---------- ----- ----
文件 17248 2008-09-24 09:34 SOCKET5SERVER\MySocks5.aps
文件 245 2003-11-28 23:21 SOCKET5SERVER\MySocks5.clw
文件 9843 2003-11-29 00:28 SOCKET5SERVER\MySocks5.cpp
文件 4308 2003-11-28 23:21 SOCKET5SERVER\MySocks5.dsp
文件 541 2003-11-28 23:21 SOCKET5SERVER\MySocks5.dsw
文件 332 2003-11-28 23:21 SOCKET5SERVER\MySocks5.h
文件 66560 2008-09-24 09:34 SOCKET5SERVER\MySocks5.ncb
文件 49664 2008-09-24 09:34 SOCKET5SERVER\MySocks5.opt
文件 2229 2008-09-24 09:34 SOCKET5SERVER\MySocks5.plg
文件 1457 2003-11-28 23:21 SOCKET5SERVER\MySocks5.rc
文件 1619 2003-11-28 23:21 SOCKET5SERVER\ReadMe.txt
文件 449 2003-11-28 23:21 SOCKET5SERVER\Resource.h
文件 295 2003-11-28 23:21 SOCKET5SERVER\StdAfx.cpp
文件 1106 2003-11-28 23:21 SOCKET5SERVER\StdAfx.h
目录 0 2008-09-24 09:41 SOCKET5SERVER
----------- --------- ---------- ----- ----
155896 15
评论
共有 条评论