
Шустрый

Профиль
Группа: Участник
Сообщений: 65
Регистрация: 21.3.2006
Репутация: нет Всего: нет
|
Для socks использую следующий код, знаю что он неполный. Но как тестовый вариант думаю пойдёт | Код | #include <winsock2.h> #include <stdio.h> #include <stdlib.h>
class CTSocket { public: virtual BOOL CreateSocket(); virtual BOOL Connect(unsigned long ip, unsigned short port); virtual BOOL Connect(LPCSTR name, unsigned short port); virtual int Send(const char* str, int len); virtual int Recv(char* buf, int max); virtual void Close(); virtual unsigned long GetHost(); // Узнать свой адрес. Это тоже может понадобиться.
private: SOCKET sock; };
BOOL CTSocket::CreateSocket() { return (sock = socket(AF_INET, SOCK_STREAM, 0)) != NULL; }
BOOL CTSocket::Connect(unsigned long ip, unsigned short port) { SOCKADDR_IN addr; memset(&addr, 0, sizeof(addr)); addr.sin_family = AF_INET; addr.sin_addr.S_un.S_addr = ip; addr.sin_port = port; return connect(sock, (SOCKADDR*)&addr, sizeof(addr)) == 0; } BOOL CTSocket::Connect(LPCSTR name, unsigned short port) { HOSTENT* p = gethostbyname(name); if (p == NULL) return FALSE; return Connect(p->h_addr_list[0], port); }
int CTSocket::Send(const char* str, int len) { return send(sock, str, len, 0); }
int CTSocket::Recv(char* buf, int max) { return recv(sock, buf, max, 0); }
void CTSocket::Close() { closesocket(sock); }
unsigned long CTSocket::GetHost() { SOCKADDR_IN addr; int cbName = sizeof(addr); if (getsockname(sock, (SOCKADDR*)&addr, &cbName) == 0) { return addr.sin_addr.S_un.S_addr; } else return 0; }
class CSocksSocket : public CTSocket { public: virtual BOOL CreateSocket(); virtual BOOL Connect(unsigned long ip, unsigned short port); virtual BOOL Connect(LPCSTR name, unsigned short port); virtual int Send(const char* str, int len); virtual int Recv(char* buf, int max); virtual void Close(); virtual unsigned long GetHost();
CTSocket* pSocket; unsigned long socks_ip; unsigned short socks_port;
private: char buffer[512]; // Такого размера точно хватит unsigned long l_ip; // Адрес, возвращаемый функцией GetHost() };
// Реализация BOOL CSocksSocket::CreateSocket() { if (!pSocket->CreateSocket()) return FALSE; if (!pSocket->Connect(socks_ip, socks_port)) return FALSE; buffer[0] = 5; // Ver buffer[1] = 1; // 1 method buffer[2] = 0; // no auth pSocket->Send(buffer, 3); int n = pSocket->Recv(buffer, 2); if (n != 2) return FALSE; if (buffer[1] != 0) return FALSE; // method 0 not supported return TRUE; }
BOOL CSocksSocket::Connect(unsigned long ip, unsigned short port) { buffer[0] = 5; // Ver buffer[1] = 1; // CONNECT buffer[2] = 0; // Reserved buffer[3] = 1; // IPv4 *((unsigned long*)(buffer + 4)) = ip; *((unsigned short*)(buffer + 8)) = port; pSocket->Send(buffer, 10); int n = pSocket->Recv(buffer, 10); if (n != 10) return FALSE; if (buffer[1] != 0) return FALSE; // Can't connect if (buffer[3] != 1) return FALSE; // Будем требовать, чтобы нам сказали IP, а не что-нибудь другое. l_ip = *((unsigned long*)(buffer + 4)); return TRUE; }
BOOL CSocksSocket::Connect(LPCSTR name, unsigned short port) { buffer[0] = 5; buffer[1] = 1; buffer[2] = 0; buffer[3] = 3; // Domain name int m = strlen(name); buffer[4] = m; // Length byte memcpy(buffer+5, name, m); // Копируем строку без завершающего нуля *((unsigned short*)(buffer + 5 + m)) = port; pSocket->Send(buffer, m + 7); int n = pSocket->Recv(buffer, 10); if (n != 10) return FALSE; if (buffer[1] != 0) return FALSE; if (buffer[3] != 1) return FALSE; // Будем требовать, чтобы нам сказали IP, а не что-нибудь другое. l_ip = *((unsigned long*)(buffer + 4)); return TRUE; }
int CSocksSocket::Send(const char* str, int len) { return pSocket->Send(str, len); }
int CSocksSocket::Recv(char* buf, int max) { return pSocket->Recv(buf, max); }
void CSocksSocket::Close() { pSocket->Close(); }
unsigned long CSocksSocket::GetHost() { return l_ip; }
// Ну, а теперь тестовая прога void main() { WSADATA wsadata; CTSocket tsock; CSocksSocket ssock; ssock.pSocket = &tsock;
WSAStartup(MAKEWORD(2,2), &wsadata);
ssock.socks_ip = inet_addr("76.233.95.138"); // Впишите сюда нужный адрес ssock.socks_port = htons(6010); // Впишите сюда порт
if (!ssock.CreateSocket()) return; // Can't connect to socks // or auth required if (!ssock.Connect("www.mail.ru", htons(80))) return; // www.mail.ru // is inaccessible LPSTR q = "HEAD / HTTP/1.1\xD\xAHost: www.mail.ru:80\xD\xAUser-Agent: xakep\xD\xA\xD\xA"; ssock.Send(q, strlen(q));
char buf[1000]; int n = ssock.Recv(buf, 1000); buf[n] = 0; printf("%s", buf);
ssock.Close(); WSACleanup(); }
|
Ну и код для OpenSSL | Код | # #include <openssl/crypto.h> #include <openssl/x509.h> #include <openssl/pem.h> #include <openssl/ssl.h> #include <openssl/err.h>
SOCKET sock; // build regular SOCK_STREAM sock and connect to server // ... (I'm not going into these details) // pretend sock is now connected....
// here's the data items we'll use.... char buf[1000]; char request[1000];
SSL_CTX *ctx; SSL *ssl; int err;
// initialize SSL stuff // SSL_load_error_strings(); SSL_library_init();
// build the SSL objects... // ctx=SSL_CTX_new(SSLv2_client_method()); ssl=SSL_new(ctx);
// assign the socket you created for SSL to use // SSL_set_fd(ssl, sock);
// communicate!! ///////////////////////////////////////////// err=SSL_connect(ssl); sprintf(request, "GET %s HTTP/1.0\r\nHost: %s\r\n\r\n","/" , "www.theserver.com"); err=SSL_write(ssl, request, strlen(request)); while(1) { int read_size; read_size=SSL_read(ssl, buf, sizeof(buf)-1); buf[read_size]='\0'; if(read_size > 0) { // I'm assuming you have a Memo object //on your application form... // Memo1->SetSelTextBuf(buf); } else { break; } }
// free the SSL stuff.... // SSL_shutdown(ssl); SSL_free(ssl); SSL_CTX_free(ctx);
|
Как это связать вместе ? Вроде всё понятно, а ничего не получается... =(
|