我正在玩SOCKS 5代理(TOR)。我能够estabilish连接,但现在我不知道如何发送和接收数据到/从目的地。谢谢帮助。代码:
#include <stdio.h>
#include <WinSock2.h>
#include <stdlib.h>
#pragma comment(lib,"ws2_32.lib")
#define PUT_BYTE(ptr,data) (*(unsigned char*)ptr = data)
int main()
{
WORD wVersionRequested = MAKEWORD(2,0);
WSADATA wsaData;
if(WSAStartup(wVersionRequested,&wsaData) != 0 )
{
return 1;
}
int fd = socket( AF_INET, SOCK_STREAM, 0);
if (fd < 0)
return 1;
struct sockaddr_in destaddr;
destaddr.sin_addr.s_addr = inet_addr("xx.xx.xx.xx");
int dest_port = 80;
struct sockaddr_in saddr;
saddr.sin_port = htons(9150);
saddr.sin_family = AF_INET;
saddr.sin_addr.s_addr = inet_addr("127.0.0.1");
int rv = connect( fd, (struct sockaddr *)&saddr, sizeof(saddr));
if(rv < SOCKET_ERROR)
return 1;
char buf[256], *ptr;
ptr = buf;
PUT_BYTE( ptr++,5);
PUT_BYTE( ptr++,1);
PUT_BYTE(ptr++,0x00);
send(fd,buf,ptr-buf,0);
recv(fd,buf,2,0);
if ( (buf[0] != 5) || buf[1] == 0xFF )
{
return 1;
}
ptr = buf;
PUT_BYTE(ptr++,5);
PUT_BYTE(ptr++,1);
PUT_BYTE(ptr++,0);
PUT_BYTE(ptr++,1);
memcpy( ptr, &destaddr.sin_addr.s_addr,sizeof(destaddr.sin_addr));
ptr += sizeof(destaddr.sin_addr);
PUT_BYTE(ptr++,dest_port>>8);
PUT_BYTE(ptr++,dest_port&0xFF);
send(fd,buf,ptr-buf,0);
recv(fd,buf,4,0);
if(buf[1] != 0x00)
{
return 1;
}
ptr = buf + 4;
switch ( buf[3] ) {
case 1:
recv( fd, ptr, 4+2,0 );
break;
case 3:
recv( fd, ptr, 1 ,0);
recv( fd, ptr+1, *(unsigned char*)ptr + 2,0);
break;
case 4:
recv( fd, ptr, 16+2,0 );
break;
}
printf("Succes!");
//How to send and receive data now? Now we are connected on port 80 and for example I want to send http get request and receive the answer.
return 0;
}
现在如何发送和接收数据?现在我们在端口80上连接,例如我想发送http get请求并接收应答。
3条答案
按热度按时间fkaflof61#
成功通过代理验证并告知连接位置后,您只需使用现有的代理连接发送/接收所需数据(在本例中为HTTP数据),就像您直接连接到目标服务器而非代理一样。一旦建立代理会话,所有后续发送/接收对您的应用都是透明的。
**更新:**您可能还需要清理代码以使其更易于阅读,修复现有的错误处理,并添加一些缺少的其他错误处理:
mm9b1k5b2#
我编写了一个现代的C++实现,用于通过SOCKS5代理服务器发送和接收数据,也使用SOCKS5的 * 用户/通行证验证 *(以及匿名模式),还使用远程和本地DNS解析选项(用于更多隐私)。
看一看:https://github.com/harsath/SOCKS5-Proxy-Handler
(免责声明:我是链接存储库的作者)。
c0vxltue3#
奥洛夫,你正在使用的例程是出了名的难。如果你的目标是让一些东西真正工作起来,我建议你使用一个建立在这些低级例程之上的工具。
最好的一个是curl,在curl网站上,他们将自己与其他你可以考虑的工具进行比较:http://curl.haxx.se/docs/comparison-table.html
编辑:好吧,那么你否决了我的答案。去看看torsocks的源代码,它试图使用这些例程。编译它并尝试运行它。它工作吗?不。看看源代码。尝试运行测试套件。它工作吗?不。看看它们调用的例程。许多例程被弃用。你甚至能找出哪些例程被弃用吗?
如果你环顾四周,你会发现那些能够在Tor上实际传输数据的人都在使用curl。