PDA

Просмотр полной версии : работа с сокетом через прокси в С/С++


KSoniX
25.03.2008, 15:44
вот мой код мне надо чтобы он работал через прокси и чтобы задавалось имя пользователя и его пасс и он делал коннект через прокси
///.................................................. .......
int main()
{
///.................................................. .......
WSADATA wsaData;
WSAStartup(MAKEWORD(2,0),&wsaData);
SOCKET sClient;
char szBuffer[1024];
int ret;
struct sockaddr_in server;
struct hostent *host = NULL;
char szServerName[1024];

strcpy(szServerName, "192.168.0.1");

// Создание сокета
sClient = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);
if (sClient == INVALID_SOCKET)
{

return 1;
}
// Заполнение структуры с адресом сервера и номером порта
server.sin_family = AF_INET;
server.sin_port = htons(80);
server.sin_addr.s_addr = inet_addr(szServerName);

// Если указано имя, то перевод символьного адреса сервера в IP
if (server.sin_addr.s_addr == INADDR_NONE)
{
host = gethostbyname(szServerName);
if (host == NULL)
{

return 1;
}
CopyMemory(&server.sin_addr, host->h_addr_list[0],
host->h_length);
}
// Соединение с сервером
if (connect(sClient, (struct sockaddr *)&server,
sizeof(server)) == SOCKET_ERROR)
{

return 1;
}
//.................................................. ..............
}

//.................................................. ..............


если можна по быстрей PLS

krypt3r
25.03.2008, 16:01
Программа-то что делает? Запрашивает некий Url? Если так, то коннект делай к проксе, а в гет/пост укажи урл к запрашиваемому сайту.

KSoniX
25.03.2008, 16:15
krypt3r клиент подключается к серверу через прокси и он должн зарегится в прокси сервере

krypt3r
25.03.2008, 16:28
Авторизация на прокси происходит внутри GET/POST-запроса в поле
Proxy-Authorization: Basic bG9naW46cGFzcw==\r\n
где bG9naW46cGFzcw== - это логин и пасс, разделенные двоеточием и закодированные в Base64

KSoniX
25.03.2008, 16:37
krypt3r куда я его поставлю в моем случае
у меня ест имя пользователя и его пасс но как его задавать с помошью winsock ?
:confused:

KSoniX
25.03.2008, 18:56
помогите Pls или что ни кто не знает! :)

x0man
26.03.2008, 00:54
Думаю стоит почтитать Rfc по Http аунтефикации...

sn0w
26.03.2008, 15:17
используй WinInet API, с сокетами геморно и бессмысленно

zythar
26.03.2008, 15:25
вот что впринципе мона сделать. сначала приконектиться к проксе через браузер и просмотреть хидеры. потом скопипастить хидеры которые ты посылаешь в твою программу. тобишь написать что то типа этого

char headers[] = "хидеры которые посылаешь";
write(s, headers, sizeof headers);

KSoniX
26.03.2008, 17:13
всем спасибо всё получилось

KSoniX
27.03.2008, 17:15
я никак не магу send сделать connect нормально проходит может я HTTP запрос не правильно дал или что делаю не так?
вот код

//.................................................. ..
strcpy(szMessage, "GET HTTP://www.google.ru HTTP/1.1 \r\n Accept: */* \r\n Host: www. google.ru \r\n\r\n");
strcpy(szServerName, "192.168.0.3");


sClient = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);
if (sClient == INVALID_SOCKET)
{

//......
}

server.sin_family = AF_INET;
server.sin_port = htons(8080);
server.sin_addr.s_addr = inet_addr(szServerName);

connect(sClient, (struct sockaddr *)&server, sizeof(server))

ret = send(sClient, szMessage, strlen(szMessage), 0);
//...............................

krypt3r
27.03.2008, 17:37
Обработку ошибок сделай и вызови GetLastError(), посмотри, что пишет

zythar
27.03.2008, 18:00
а откуда ты знаешь что ты не можешь делать send?
ты сравни ret с нулем. если больше то все ок. ошибка в хидере. если меньше тогда действительно проблемы с sendом

KSoniX
27.03.2008, 18:00
у меня ret=-1 GetLastError() не работает
я поставил вот так но ничо не выдает
ret = send(sClient, szMessage, strlen(szMessage), 0);
GetLastError();

zythar
27.03.2008, 18:04
попробуй write-ом. покури маны GetLastError-а.

KSoniX
27.03.2008, 18:21
все нашел коннект не делает оказывается спасибо всем держите +

krypt3r
28.03.2008, 11:45
ret = send(sClient, szMessage, strlen(szMessage), 0);
GetLastError();

Ну не так же делают обработку ошибок ))

if ((ret = send(sClient, szMessage, strlen(szMessage), 0)) < 0)
{
...
printf ("Error: %d\n", GetLastError());
// закрытие всего открытого - файлов, сокетов, и остановка программы
...
}

KSoniX
03.04.2008, 16:55
помогите PLS вот код с запросим HTTP конек к прокси нормально делает но
sprintf(buffer,"GET %s HTTP/1.0 \r\nHost: %s\r\nProxy-Authorization: Basic %s\r\nUser-Agent: MSIE 5.0 (compatible; MSIE 5.0; Windows 98; DigExt)\r\nConnection: close\r\n\r\n",http://database.clamav.net/daily.cvd,"http://database.clamav.net",userpass);
retval=send(sock,buffer,strlen(buffer),0);
if ( PrintLog == true ) { printf(buffer); }

retval = recv(sock,buffer,1024,0);buffer[retval]=0;

вы даёт ошибку кагда делаю recv в buffer приходит сопшения
HTTP/1.1 400 Bad Request
Via: 1.1 GATESERVER
Connection: close
Proxy-Connection: close
Content-Length: 302
Date: Thu, 03 Apr 2008 12:42:40 GMT
Content-Type: text/html; charset=iso-8859-1
Server: Apache

<!DOCTYPE HTML PUBLIC "-//IETF//DTD HTML 2.0//EN">
<html><head>
<title>400 Bad Request</title>
</head><body>
<h1>Bad Request</h1>
<p>Your browser sent a request that this server could not understand.<br />
</p>
<hr>
<address>Apache Server at http://database.clamav.net Port 80</address>
</body></html>

вот http запрос GET http://database.clamav.net/daily.cvd HTTP/1.0 Host: http://database.clamav.net
Proxy-Authorization: Basic eG1hYmJvczpAbGVsdXlBMTk4ODE5NjEAAA==
User-Agent: MSIE 5.0 (compatible; MSIE 5.0; Windows 98;DigExt)
Connection: close
что делать ? :(

KSoniX
03.04.2008, 17:30
я думаю что у меня с http запросом что-то ни то или в User-Agent я должен указать другой браузер?????:)

zythar
03.04.2008, 17:47
дело не в браузере. просто тот реквест который ты посылаешь сервак не понимает.
попробуй отправлять хидер без написания всего этого в буффер. а откуда у тебя запрос? сам сочинял или скпипастил из браузера?

KSoniX
03.04.2008, 18:12
вот если хост не указываю то все нормально вот почему ?
может потому что я уже за коннектился на прокси ?:(

Algol
11.04.2008, 11:10
GET http://database.clamav.net/daily.cvd HTTP/1.0
Host: database.clamav.net
Proxy-Authorization: Basic eG1hYmJvczpAbGVsdXlBMTk4ODE5NjEAAA==
User-Agent: MSIE 5.0 (compatible; MSIE 5.0; Windows 98;DigExt)
Connection: close

KSoniX
11.04.2008, 17:25
Algol что это означает я же хттп запрос так и прописывал но щас у меня хттп запрос

GET http://database.clamav.net/daily.cvd HTTP/1.0
Proxy-Authorization: Basic eG1hYmJvczpAbGVsdXlBMTk4ODE5NjEAAA==



в конце CRLF вот так работает а если повашему запросу то не работает вот почему ?
я еше непонял :(

KSoniX
11.04.2008, 18:32
а я все понял гог да хост указывается надо писать без хттп://
спасибо Algol балшая а я мучался мозг порыл вот жал чтоя не магу + поставит вам

KSoniX
17.04.2008, 13:12
подскажите как сделать до качку чрез http запрос?