Senden und empfangen über SOCKS5 c++
Spiele ich mit SOCKS5-proxy ( TOR ). Ich bin in der Lage, estabilish-Verbindung, aber jetzt weiß ich nicht wie das senden und empfangen von Daten zu/von der destination. Danke für die Hilfe. Code:
#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;
}
Wie zum senden und empfangen von Daten jetzt? Jetzt sind wir angeschlossen an port 80 und für das Beispiel, ich möchte zum senden von http get-Anforderung und die Antwort erhalten.
Du musst angemeldet sein, um einen Kommentar abzugeben.
Wenn Sie sich erfolgreich authentifiziert, mit proxy und gesagt, es wo zu verbinden, dann klicken Sie einfach send/recv Ihre gewünschten Daten (in diesem Fall die HTTP-Daten) mit der bestehenden Verbindung zu proxy, als ob Sie miteinander verbunden hatten, um den Ziel-server direkt und nicht über einen proxy. Sobald der proxy-Sitzung eingerichtet ist, werden alle nachfolgenden sendet/empfängt, sind transparent für Ihre app.
Update: vielleicht wollen Sie auch zu bereinigen Sie Ihren code, so dass es leichter zu Lesen ist, fixieren Sie Ihre vorhandenen gebrochenen Fehlerbehandlung, und fügen Sie einige zusätzliche Fehlerbehandlung fehlt:
Olof, die Routinen, die Sie verwenden sind notorisch schwierig. Wenn Ihr Ziel ist es, um tatsächlich etwas zu arbeiten, würde ich empfehlen, dass Sie verwenden ein tool, das gebaut worden ist, oben auf dieser low-level-Routinen.
Die beste ist, curl. Bei der curl-website, die Sie vergleichen sich mit den anderen tools, die Sie in Betracht ziehen könnte: http://curl.haxx.se/docs/comparison-table.html
Edit: okay, also Sie gewählt meine Antwort. Gehen Sie und betrachten Sie die Quelle code für torsocks, die versucht, die Verwendung dieser Routinen. Kompilieren Sie es und führen Sie es. Funktioniert es? Nein. Blick auf den Quellcode. Versuchen Sie zum ausführen der Testsuite. Funktioniert es? Nein. Blick auf die Routinen, die Sie nennen. Viele sind veraltet. Können Sie auch herausfinden, welche Routinen sind veraltet?
Wenn Sie sich umschauen, werden Sie sehen, dass die Menschen, die in der Lage sind tatsächlich übertragen Daten über Tor mit curl.
curl
aus einem C++ - Programm?