1. 程式人生 > >網路上找到的socket5 udp c++ 程式碼 可供參考

網路上找到的socket5 udp c++ 程式碼 可供參考

// ProxySocketSocksV5.h : header file
//

/*
使用Socks5代理協議的socket類,目前只支援UDP協議。

[email protected] 24/09/2002
*/
#if !defined(AFX_PROXYSOCKETSOCKSV5_H__07BD21EA_0867_4F91_A82A_72F3AF706228__INCLUDED_)
#define AFX_PROXYSOCKETSOCKSV5_H__07BD21EA_0867_4F91_A82A_72F3AF706228__INCLUDED_

#if _MSC_VER > 1000
#pragma once
#endif // _MSC_VER > 1000


//驗證方法選擇 請求
struct SOCKS5SELECTREQEST
{
BYTE ver; //版本號,必須是5
BYTE nmethods; //認證方法的數量
BYTE methods[255]; //認證方法
/*
· '00' 不需要認證
· '01'    GSSAPI
· '02'    使用者名稱/密碼
· '03' -- X'7F'   由IANA分配
· '80' -- X'FE'  為私人方法所保留的
· 'FF'      沒有可以接受的方法
*/
};

//驗證方法選擇 迴應
struct SOCKS5SELECTANSWER
{
BYTE ver; //版本號,必須是5
BYTE method; //驗證方法,是SOCKS5REQUEST1中methods[255]中的一個值

//具體見SOCKS5REQUEST1.methods[255]的說明
};

//驗證 請求
struct SOCKS5AUTHENTICATE
{
BYTE ver; //版本號,為1
BYTE ulen; //使用者名稱長度
BYTE user[255]; //使用者名稱
BYTE plen; //密碼長度
BYTE pass[255]; //密碼
};

//驗證 迴應
struct SOCKS5AUTHANSWER
{
BYTE ver; //版本號
BYTE state; //驗證狀態
};

//Socks5命令 請求
struct SOCKS5COMMANDREQUEST
{
BYTE ver; //版本號
BYTE cmd; //命令
/*
CONNECT:'01'
BIND:'02'

UDP ASSOCIATE:'03'
*/
BYTE rsv; //保留,必須為0
BYTE type; //表明其後的地址型別
/*
· IPV4:X'01'
· 域名:X'03'
· IPV6:X'04'
*/
ULONG addr; //目標地址,這裡只支援ipv4
/*取決於type
'01': 基於IPV4的IP地址,4個位元組長
'03': 基於域名的地址,地址欄位中的第一位元組是以位元組為單位的該域名的長度,沒有結尾的NUL位元組。
'04': 基於IPV6的IP地址,16個位元組長
*/
WORD port; //目標埠(網路位元組順序)
};

//SOCKS5命令 迴應
struct SOCK5COMMANDANSWER
{
BYTE ver; //版本號
BYTE rep; //迴應訊息
/*
· X'00'  成功
· X'01'  普通的SOCKS伺服器請求失敗
· X'02'  現有的規則不允許的連線
· X'03'  網路不可達
· X'04'  主機不可達
· X'05' 連線被拒
· X'06'  TTL超時
· X'07'  不支援的命令
· X'08'  不支援的地址型別
· X'09' - X'FF'  未定義
*/
BYTE rsv; //保留
BYTE type; //同SOCKS5COMMANDREQUEST
ULONG addr; //返回的地址
WORD port; //返回的埠(網路位元組順序)
};

//socks5規定的udp資料包頭
struct SOCKS5UDPHEADER
{
WORD rsv; //保留
BYTE frag; //分段標誌,如果不分段則為0
BYTE type; //同SOCKS5COMMANDREQUEST
ULONG addr; //目標地址,同SOCKS5COMMANDREQUEST
WORD port; //目標埠,同SOCKS5COMMANDREQUEST
};
/////////////////////////////////////////////////////////////////////////////
// CProxySocketSocksV5 command target

class CChildView;
class CProxySocketSocksV5 : public CAsyncSocket
{
SOCKET m_SocketCommand; //與Sock5伺服器互動的socket
BOOL m_bConnected;
ULONG m_AddrBinding;
WORD m_PortBinding;
// Attributes
public:
CChildView* m_pView;
char m_User[255]; //使用者名稱
char m_Pass[255]; //密碼
char m_Server[20]; //socks5 server ip
WORD m_Port;
// Operations
public:
CProxySocketSocksV5();
virtual ~CProxySocketSocksV5();

int SendTo(const void* lpBuf, int nBufLen,
UINT nHostPort, LPCTSTR lpszHostAddress = NULL, int nFlags = 0);
int SendTo(const void* lpBuf, int nBufLen,
const SOCKADDR* lpSockAddr, int nSockAddrLen, int nFlags = 0);
int ReceiveFrom(void* lpBuf, int nBufLen,
CString& rSocketAddress, UINT& rSocketPort, int nFlags = 0);
int ReceiveFrom(void* lpBuf, int nBufLen,
SOCKADDR* lpSockAddr, int* lpSockAddrLen, int nFlags = 0);
// Overrides
public:
void Close();
UINT ConnectToProxyServer(const char* server = NULL,WORD nPort = 0, char* user = NULL, char* pass = NULL);
// ClassWizard generated virtual function overrides
//{{AFX_VIRTUAL(CProxySocketSocksV5)
public:
virtual void OnReceive(int nErrorCode);
//}}AFX_VIRTUAL

// Generated message map functions
//{{AFX_MSG(CProxySocketSocksV5)
// NOTE - the ClassWizard will add and remove member functions here.
//}}AFX_MSG

// Implementation
protected:
};

/////////////////////////////////////////////////////////////////////////////

//{{AFX_INSERT_LOCATION}}
// Microsoft Visual C++ will insert additional declarations immediately before the previous line.

#endif // !defined(AFX_PROXYSOCKETSOCKSV5_H__07BD21EA_0867_4F91_A82A_72F3AF706228__INCLUDED_)

/////////////////////////////////////////////////////////////////////////////
// CProxySocketSocksV5

CProxySocketSocksV5::CProxySocketSocksV5()
{
m_Port = 0;
ZeroMemory(m_User,255);
ZeroMemory(m_Pass,255);
ZeroMemory(m_Server,20);
m_bConnected = FALSE;
m_AddrBinding = 0;
m_PortBinding = 0;
}

CProxySocketSocksV5::~CProxySocketSocksV5()
{
}


// Do not edit the following lines, which are needed by ClassWizard.
#if 0
BEGIN_MESSAGE_MAP(CProxySocketSocksV5, CAsyncSocket)
//{{AFX_MSG_MAP(CProxySocketSocksV5)
//}}AFX_MSG_MAP
END_MESSAGE_MAP()
#endif // 0

/////////////////////////////////////////////////////////////////////////////
// CProxySocketSocksV5 member functions

//連線到socks5代理伺服器,在傳送或接收前先呼叫次函式
//函式返回0表示成功,返回其他數值表示失敗,具體意義見程式碼
UINT CProxySocketSocksV5::ConnectToProxyServer(const char* server,WORD nPort, char* user, char* pass)
{
if(server != NULL)
strcpy(m_Server,server);
if(nPort != 0)
m_Port = nPort;
if( user != NULL)
strcpy (m_User,user);
if(pass != NULL)
strcpy (m_Pass,pass);

char buf[1024];
ASSERT(m_hSocket != INVALID_SOCKET);

if(m_SocketCommand != INVALID_SOCKET)
closesocket(m_SocketCommand);

m_SocketCommand = socket(AF_INET,SOCK_STREAM,0);

SOCKADDR_IN addr;
addr.sin_addr.s_addr = inet_addr(m_Server);
addr.sin_family = AF_INET;
addr.sin_port = htons(m_Port);

if(m_SocketCommand == INVALID_SOCKET)
return 1; //Create Socket Error
if(SOCKET_ERROR == connect(m_SocketCommand,(sockaddr*)&addr,sizeof(addr)))
{
closesocket (m_SocketCommand);
return 2; //connect socks server error;
}

SOCKS5SELECTREQEST selectrequest;
ZeroMemory(&selectrequest,sizeof(selectrequest));
selectrequest.ver = 5;
selectrequest.nmethods = 2;
selectrequest.methods[0] = 0;
selectrequest.methods[1] = 2;

if(SOCKET_ERROR  == send(m_SocketCommand,(char*)&selectrequest,4,0))
{
closesocket (m_SocketCommand);
return 3; //send error
}

ZeroMemory(buf,1024);
if(SOCKET_ERROR == recv(m_SocketCommand,buf,1024,0))
{
closesocket (m_SocketCommand);
return 4; //recv error
}

SOCKS5SELECTANSWER *pselectanswer = (SOCKS5SELECTANSWER *)buf;
if((pselectanswer->method != 0 && pselectanswer->method != 2) || pselectanswer->ver != 5)
{
closesocket (m_SocketCommand);
return 5; //無合適的驗證方法
}

if(pselectanswer->method == 2)
{
SOCKS5AUTHENTICATE auth;
ZeroMemory(&auth,sizeof(auth));
auth.ver = 1;
auth.ulen = strlen(m_User)>254?254:strlen(m_User);

相關推薦

網路上找到的socket5 udp c++ 程式碼 參考

// ProxySocketSocksV5.h : header file///*使用Socks5代理協議的socket類,目前只支援UDP協議。[email protected] 24/09/2002*/#if !defined(AFX_PROXYSOCKETS

一個參考的面向大型集團公司的雲平臺架構解析

在過去的二十多年中,很多國內的大型集團公司都已經建立了非常龐大的業務資訊系統,包括 OA 系統、ERP 系統、CRM 系統、HRM 系統以及各種行業應用系統,為了保證這些業務資訊系統的長期穩定執行,還建設了一批支撐型資訊系統,如監控系統、身份認證系統、安全執行中心等。這些資訊系統通常在建設期間獨立

貝聊架構師林毅:一個參考的系統部署工具

說到系統部署工具,大的網際網路公司基本上是自己研發,一鍵自動部署到數百臺到數千臺伺服器, 比如 twitter 開源的 Murder。小的公司可能使用一些開源工具,比如 Jenkins、Puppet、Ansible 結合一些指令碼進行。 開源的部署工具有 Capistrano、瓦力等,線上部署的有

一個參考的Java高併發非同步應用案例

泰康線上微信公眾號系泰康線上財產保險股份有限公司旗下平臺,希望可以通過持續不斷的創新,提升客戶對於保險的認知及體驗,通過對大資料技術的應用,精準的為客戶設計產品以及提供服務。泰康線上微信公眾號,現有1000多萬粉絲。在日常的運營中,藉助於紅包獎勵、卡券分享、訊息通知、微信

一些參考的遊戲出海技術架構與經驗總結

作者|UCloud         出品|遇見人工智慧        公眾號|GOwithAI對

c/c++ 絡編程 UDP 發送端 bind 作用

ddr ast netd arp mem 分享圖片 sendto 隨機 eba 網絡編程 UDP 發送端 bind 作用 upd 發送端 調用bind函數的效果:把socket特定到一個指定的端口,如果不調用bind,內核會隨機分配一個端口。 upd 發送端 調用bi

c/c++ 絡編程 UDP 用if_nameindex和ioctl取得主機絡信息

soc n-2 技術分享 ram ddr con ioc alt lis 網絡編程 UDP 用if_nameindex和ioctl取得主機網絡信息 getifaddrs函數取得的東西太多了,如果只想取得網卡名字和網卡編號可以用下面的2個函數。 1,if_nameindex

c/c++ 絡編程 UDP 改變卡的硬件地址

socket gif http ram mil net sign strncpy hang 網絡編程 UDP 改變網卡的硬件地址 在程序裏動態改變網卡的硬件地址 1,取得網卡的硬件地址 #include <stdio.h> #include <stri

c/c++ 絡編程 UDP 改變關和卡名字

ket ref git com wangka ast req font 動態 網絡編程 UDP 改變網關和網卡名字 在程序裏動態改變網關和網卡名字 1,改變網卡名字 #include <stdio.h> #include <string.h> #

Linux c++,用訊號量實現消費者生產者佇列(程式碼直接通過編譯)

//用訊號量實現的一個消費者生產者佇列, #include <iostream> #include <pthread.h> #include <semaphore.h> #include <errno.h> #include <queue>

C程式碼變成執行檔案的過程

C程式碼是如何變成程式的 C語言是一門典型的編譯語言,原始碼檔案需要編譯成目的碼檔案才能執行。可以認為程式檔案就是編譯好的目的碼檔案。以GCC的編譯過程為例。GCC的翻譯過程可以分成四個階段:前處理器、編譯器、彙編器、連結器,執行這四個階段的程式一起構成了一個編譯系統。 前

出陣列中第k大的數(時間複雜度分析、C++程式碼實現). TopK in array. ( leetcode

找出陣列中第k大的數. TopK in array. ( leetcode - 215 ) 最近面試過程中遇到的一個題目,也是大資料時代常見的題目,就來總結一下。 面試題目: 1、10億數中,找出最大的100個數。用你能想到的最優的時間和空間效率。 2

交通標識牌檢測及識別c++程式碼例項及執行結果 (自行在網上下載圖片測試)

執行環境:vs2013+opencv2.4.9+win10 資料來源於GTSRB 效果不是很理想(預處理方法、檢測用的rgb2hsv、圓度檢測,、引數,總之改變程式中很多東西可以嘗試提高準確率),但檢測及識別的道路是打通了 c++程式碼 #include<iostr

IP/UDP校驗和的C程式碼實現

序言 之前寫資料封裝程式的時候涉及到IP頭校驗和、UDP校驗和計算,在這裡回顧。 IP頭校驗和原理 IP校驗和只針對IP資料包頭部進行。在路由資料轉發的過程中如果對每一個數據包的資料都進行校驗將會是很耗時的事情,而且TCP提供了資料的差錯控制和擁塞

C# TCP/UDP 通訊程式碼講解

之前寫一個檔案傳輸軟體的時候不過的瞭解這 TCP和UDP的 一些概念和 知識,趁著目前還熱乎著,寫下來溫習一下。。第一次寫部落格 有不好的地方歡迎指出來。 首先介紹下我之前寫的思路。大家都知道 UDP是沒有連線是不可靠的,而TCP是面向連線可靠的連線。雖然TCP面向連線並

visual studio編寫C#程式碼時“未能從程式集.....中載入型別”和“不到方法”的一種可能的解決辦法

編譯前報錯:$exception    {"未能從程式集“XSW.MySQLDAL, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null”中載入型別“XSW.MySQLDAL.EnterpriseLibraryProd

C++11:使用 auto/decltype/result_of使程式碼讀易維護

C++11 終於加入了自動型別推導。以前,我們不得不使用Boost的相關元件來實現,現在,我們可以使用“原生態”的自動型別推導了!C++引入自動的型別推導,並不是在向動態語言(強型別語言又稱靜態型別語言,是指需要進行變數/物件型別宣告的語言,一般情況下需要編譯執行。例如C/C

推箱子小遊戲 C語言 共寫了四十關,遊戲有多種模式,適合新手學習交流 有全部完整程式碼直接編譯執行

}void middleMap(int Map[20][20],int *n,int *m,char *ch) {//中等關卡    static int cs=0;    int guan;    //fscanf(fp1, "%d", &guanshu2);    //fclose(fp1);//

C/C++提取執行程式碼

使用C/C++語言,結合內聯彙編,可以方便的提取可執行程式碼。下面一個例子,掌握了這種方法,很容易舉一反三。 例程: 先用內聯彙編設計出一個顯示對話方塊的函式MsgBox,然後通過C/C++指標把這個函式的實體地址程式碼取出並列印。 程式使用了2個函式,MsgBox()用於

Linux高危漏洞曝光:Linux 內核 ipv4/udp.c 遠程恣意代碼執行

linux高危漏洞漏洞描述Linux kernel是美國Linux基金會發布的操作體系Linux所使用的內核。Linux kernel 4.5之前的版別中的udp.c文件存在安全縫隙,Linux內核中的udp.c答應長途攻擊者經過UDP流量履行恣意代碼,這些流量會在履行具有MSG_PEEK象征的recv體系調