2leonid,
Выше Вам SS пропостил, как сделать POST:
print $SOCKET "POST "; print $SOCKET $_[0];
print $SOCKET "\nContent-Type: application/x-www-form-urlencoded\n\n";
print $SOCKET "log_update="; print $SOCKET $_[1];
Я Вам дал ссылку на "С++"-код с POST с использованием
пушки (по воробьям), WinInet. Подрихтуете, исправите ошибки (они там есть). Можно пользоваться. И, кстати, Мармоту будет приятно, если Вы его идею поддержите, насчёт WinInet

Я тоже думаю, что WinInet - хорошая штука. И конечно поддерживаю Мармота. Но для простых задач, ведь WinInet ещё и изучать надо

Ваша задача включает только одну операцию, никаких наворотов нет. Поэтому, я думаю, что в таких случаях, можно просто писать в сокет прокси то, что требует http 1.1. Ниже работающий код, где делается GET, а не POST. По крайней мере, это скомпилировано, проверено мною в разных ракурсах (и с аутинтификацией, и без неё, и с совсем просто и чуть сложнее). С POST мне негде протестировать мой код, к сожалению, сейчас. Замените там GET на РОST + то, что Вам пропостили (....Content-Type: application....). Думаю, Вы получите желаемый результат. И ещё, там ниже некоторые вариации в зависимости от того, разрешён анонимный логон, или нет на прокси из локалки. Здесь всё будет зависеть от админов Ваших кастомеров. Как они заставят юзверей логониться, так и будет.
Код: Выделить всё
int _tmain(int argc, _TCHAR* argv[])
{
WSAData wsaData;
if (WSAStartup(0x202,(WSADATA *)&wsaData ))
{
printf("WSAStart error %d\n",WSAGetLastError());
return -1;
}
// Cоздаём обычный сокет, как для LAN.
SOCKET sock;
sock=socket(AF_INET,SOCK_STREAM,0);
if ( sock < 0 )
{
printf("Socket() error %d\n",WSAGetLastError());
closesocket(sock);
WSACleanup();
return -1;
}
// прокси-сервер у нас в локальной сети здесь
#define PROXYSERVER "192.168.55.5"
#define PROXYPORT 3080 // Прокси-изделия M$ по умолчанию слушают 8080. Подрихтуйте;))
sockaddr_in socks_addr;
socks_addr.sin_family = AF_INET;
socks_addr.sin_port = htons(PROXYPORT);
socks_addr.sin_addr.s_addr = inet_addr(PROXYSERVER);
// коннектимся к прокси-серверу
if ( connect( sock,(sockaddr *)&socks_addr, sizeof(socks_addr)) )
{
printf("Connect error %d\n",WSAGetLastError());
closesocket( sock );
WSACleanup();
return -1;
}
printf("Connection with PROXY SEREVER %s Ok\n",PROXYSERVER);
// Разумеется, надо делать не так, а realloc - ком ;)). Иначе сами себя хакнем когда-нибудь ;))
#define BUFSIZE 1024*10
char rqstbuf[BUFSIZE];
char rcvbuf[BUFSIZE];
// Посылаем запрос. В самом конце ещё раз\r\n. Эт важно.
strcpy(rqstbuf, "GET http://www.ya.ru/ HTTP/1.1\r\n");
_send( sock, (_BYTE *) rqstbuf, (_DWORD) strlen(rqstbuf), 0, 1);
strcpy(rqstbuf, "User-Agent: Leonid Uploader\r\n"); // ;))
_send( sock, (_BYTE *) rqstbuf, (_DWORD) strlen(rqstbuf), 0, 1);
strcpy(rqstbuf, "Host: www.ya.ru\r\n");
_send( sock, (_BYTE *) rqstbuf, (_DWORD) strlen(rqstbuf), 0, 1);
// А вот здесь аутентифицируемся на проксе для аутгоинг риквестов.
strcpy(rqstbuf, "Proxy-Authorization: Basic VXNlcjpQYXNzd29yZA==\r\n\r\n");
_send( sock, (_BYTE *) rqstbuf, (_DWORD) strlen(rqstbuf), 0, 1);
// Читаем html страничку. В данном случае BUFSIZE хватит с избытком для www.ya.ru
memset( rcvbuf, 0, BUFSIZE);
int rcvbytes = _recv( sock, (_BYTE *) rcvbuf, BUFSIZE, 0, 5);
printf("%s\n",rcvbuf);
shutdown( sock, SD_SEND );
closesocket( sock );
WSACleanup();
printf("\nAny key for exit...");
getch();
return 0;
}
Если аутентификация на прокси не поддерживается (легко, например, для winproxy, а эта байда тоже может быть у кастомера

), или отключена (по умолчанию отключена у изделий MS, и почему-то не все админы вспоминают включить

), то строчки:
Код: Выделить всё
strcpy(rqstbuf, "Proxy-Authorization: Basic VXNlcjpQYXNzd29yZA==\r\n\r\n");
_send( sock, (_BYTE *) rqstbuf, (_DWORD) strlen(rqstbuf), 0, 1);
...писать не надо, а вот в конце предыдущих строчек надо обязательно добавить <\r\n>. Т.е. она будет выглядеть:
Код: Выделить всё
strcpy(rqstbuf, "Host: www.ya.ru\r\n\r\n");
Короче, пишите на сокетах. Прозрачно. Эффективно. Быстро пишется. Не требует ни могутных библиотек, ни .... Прости, Marmot
ПС. Там для http 1.1 я привёл только минимум, разумеется для GET-та можно былоб дописывать всякую фигню:
Код: Выделить всё
...
strcpy(rqstbuf, "Accept: image/gif, image/x-xbitmap, image/jpeg, image/pjpeg, application/vnd.ms-powerpoint, application/vnd.ms-excel, application/msword, */*\r\n");
_send( sock, (_BYTE *) rqstbuf, (_DWORD) strlen(rqstbuf), 0, 1);
strcpy(rqstbuf, "Accept-Language: ru\r\n");
_send( sock, (_BYTE *) rqstbuf, (_DWORD) strlen(rqstbuf), 0, 1);
strcpy(rqstbuf, "Accept-Encoding: gzip, deflate\r\n");
_send( sock, (_BYTE *) rqstbuf, (_DWORD) strlen(rqstbuf), 0, 1);
...
strcpy(rqstbuf, "Proxy-Connection: Keep-Alive\r\n");
_send( sock, (_BYTE *) rqstbuf, (_DWORD) strlen(rqstbuf), 0, 1);
...
Ну, а для POST - сделаете сами.
