|
200精币
TcpClient的Socket5代理连接不上,请问各位大牛是什么问题呢?
s5无账密的偶尔可以连接上,但是s5有账密的就连接不上
代码借鉴的是 @L1yp 大佬的源码
.版本 2
.支持库 spec
s = TcpClientKeyGetSocket (keyPtr)
.如果真 (s = 0)
返回 (假)
.如果真结束
' 用户名 = “zhima”
' 密码 = “zhima”
.判断开始 (全局_启用代理)
.判断开始 (提取代理IP (代理地址, 代理端口)) ' 代理模式
调试输出 (代理地址, 到短整数 (代理端口))
addr.sin_addr = GetNetAddrName (代理地址) ' inet_addr (代理地址)
addr.sin_port = htons (代理端口)
addr.sin_family = 2
调试输出 (addr.sin_addr, addr.sin_port)
.默认
addr.sin_addr = inet_addr (sAddr)
addr.sin_port = htons (到短整数 (iPort))
addr.sin_family = 2
.判断结束
.默认
addr.sin_addr = inet_addr (sAddr)
addr.sin_port = htons (到短整数 (iPort))
addr.sin_family = 2
.判断结束
ret = connect (s, addr, 16)
.如果真 (ret = -1)
输出调试文本 (“ConnectServer -> connect (s, addr, 16) ret SOCKET_ERROR;”)
closesocket (s)
返回 (假)
.如果真结束
.如果真 (代理地址 ≠ “” 且 代理端口 ≠ 0)
调试输出 (“代理模式”)
.判断开始 (用户名 = “” 或 密码 = “”)
bys = { 5, 1, 0 }
buf = 取变量数据地址 (bys)
len = 取字节集长度 (bys)
timeout = 到字节集 (5000)
setsockopt (s, 65535, 4101, timeout, 4)
setsockopt (s, 65535, 4102, timeout, 4)
ret = send (s, buf, len, 0)
.如果真 (ret = -1)
输出调试文本 (“ConnectServer -> connect (s, addr, 16) ret Proxy Validation failure”)
closesocket (s)
返回 (假)
.如果真结束
bys = 取空白字节集 (128)
buf = 取变量数据地址 (bys)
len = 取字节集长度 (bys)
ret = recv (s, buf, len, 0)
.如果真 (ret = -1)
输出调试文本 (“ConnectServer -> connect (s, addr, 16) ret Proxy Validation failure”)
closesocket (s)
返回 (假)
.如果真结束
.判断开始 (bys [1] = 5 且 bys [2] = 0) ' 如果返回成功第一个字节是5
' 验证成功 发送服务器真实IP和端口
' 05 01 00 01 DF A6 97 8D 01 BB
bys = GetProxyAddressBytes (sAddr, iPort, 假)
buf = 取变量数据地址 (bys)
len = 取字节集长度 (bys)
ret = send (s, buf, len, 0)
.如果真 (ret = -1)
输出调试文本 (“ConnectServer -> connect (s, addr, 16) ret Proxy Validation failure”)
closesocket (s)
返回 (假)
.如果真结束
bys = 取空白字节集 (128)
buf = 取变量数据地址 (bys)
len = 取字节集长度 (bys)
ret = recv (s, buf, len, 0)
.如果真 (ret = -1)
输出调试文本 (“ConnectServer -> connect (s, addr, 16) ret Proxy Validation failure”)
closesocket (s)
返回 (假)
.如果真结束
.判断开始 (bys [1] = 5 且 bys [2] = 0) ' 如果返回成功第一个字节是5
调试输出 (“代理连接成功”)
.默认
输出调试文本 (“ConnectServer -> connect (s, addr, 16) ret Proxy Validation failure”)
closesocket (s)
返回 (假)
.判断结束
.默认
输出调试文本 (“ConnectServer -> connect (s, addr, 16) ret Proxy Validation failure”)
closesocket (s)
返回 (假)
.判断结束
.默认
' 需要密码模式
bys = { 5, 1, 2 }
buf = 取变量数据地址 (bys)
len = 取字节集长度 (bys)
调试输出 (s, buf, len, bys)
ret = send (s, buf, len, 0)
.如果真 (ret = -1)
输出调试文本 (“ConnectServer -> connect (s, addr, 16) ret Proxy Validation failure11”)
closesocket (s)
返回 (假)
.如果真结束
bys = 取空白字节集 (128)
buf = 取变量数据地址 (bys)
len = 取字节集长度 (bys)
ret = recv (s, buf, len, 0)
调试输出 (bys)
.如果真 (ret = -1)
输出调试文本 (“ConnectServer -> connect (s, addr, 16) ret Proxy Validation failure22”)
closesocket (s)
返回 (假)
.如果真结束
.判断开始 (bys [1] = 5 且 bys [2] = 2) ' 如果返回成功第一个字节是5
' 验证成功 发送服务器真实IP和端口
' 05 01 00 01 DF A6 97 8D 01 BB
bys = GetProxyUserPwdBytes (用户名, 密码)
buf = 取变量数据地址 (bys)
len = 取字节集长度 (bys)
ret = send (s, buf, len, 0)
.如果真 (ret = -1)
输出调试文本 (“ConnectServer -> connect (s, addr, 16) ret Proxy Validation failure333”)
closesocket (s)
返回 (假)
.如果真结束
bys = 取空白字节集 (128)
buf = 取变量数据地址 (bys)
len = 取字节集长度 (bys)
ret = recv (s, buf, len, 0)
.如果真 (ret = -1)
输出调试文本 (“ConnectServer -> connect (s, addr, 16) ret Proxy Validation failure444”)
closesocket (s)
返回 (假)
.如果真结束
.判断开始 (bys [1] = 1 且 bys [2] = 0) ' 01 00
bys = GetProxyAddressBytes (sAddr, iPort, 真)
buf = 取变量数据地址 (bys)
len = 取字节集长度 (bys)
ret = send (s, buf, len, 0)
.如果真 (ret = -1)
输出调试文本 (“ConnectServer -> connect (s, addr, 16) ret Proxy Validation failure555”)
closesocket (s)
返回 (假)
.如果真结束
bys = 取空白字节集 (128)
buf = 取变量数据地址 (bys)
len = 取字节集长度 (bys)
ret = recv (s, buf, len, 0)
.如果真 (ret = -1)
输出调试文本 (“ConnectServer -> connect (s, addr, 16) ret Proxy Validation failure666”)
closesocket (s)
返回 (假)
.如果真结束
.判断开始 (bys [1] = 5 且 bys [2] = 0) ' 如果返回成功第一个字节是5
调试输出 (“代理连接成功”)
.默认
输出调试文本 (“ConnectServer -> connect (s, addr, 16) ret Proxy Validation failure777”)
closesocket (s)
返回 (假)
.判断结束
.默认
输出调试文本 (“ConnectServer -> connect (s, addr, 16) ret Proxy Validation User failure888”)
closesocket (s)
返回 (假)
.判断结束
.默认
输出调试文本 (“ConnectServer -> connect (s, addr, 16) ret Proxy Validation failure999”)
closesocket (s)
返回 (假)
.判断结束
.判断结束
.如果真结束
ret = CreateIoCompletionPort (s, hIocp, keyPtr, 0)
调试输出 (ret)
.如果真 (ret = 0)
输出调试文本 (“创建IOCP失败”)
返回 (假)
.如果真结束
recvHandle = TcpClientHandleCreate (8192, #TCP_OP_RECV, extra, 0, 0)
调试输出 (取程序名称 (1), “recvHandle”, recvHandle)
ret = WSARecv (s, recvHandle + 20, 1, recvHandle + 36, recvHandle + 40, recvHandle, 0)
调试输出 (ret)
.判断开始 (ret = 0)
返回 (真)
.判断 (ret = -1)
errno = WSAGetLastError ()
调试输出 (errno)
.判断开始 (errno = 997 或 errno = 0)
返回 (真)
.默认
输出调试文本 (“ConnectServer->” + GetLastErrorDesc (errno))
closesocket (s)
TcpClientKeySetSocket (keyPtr, 0)
TcpClientHandleDestory (recvHandle)
返回 (假)
.判断结束
.默认
返回 (假)
|
最佳答案
查看完整内容
不是先发{5,1,2}而是 { 5, 2 } ;发了后会返回账号跟密码的包,校验下是否一致,一致的继续发{ 1, 0 }表示账号密码正确;然后就接收到转向目标的ip跟端口,这个时候你把数 据取出来解析再用客户Duan连接上做好转发处理即可;做完上面步骤再把这堆数 据的第2字节改为0原封不动传回去,表示你已经跟目标ip建立了关系,可以正常通讯了 ...
|