![]() |
Release HttpProxyServer
Вот собсна решил наваять и выложить на общий суд
-язык с+api -открывает 31337 порт -логов не ведет -весит мало ~10к (так я не понял откуда лишних 5к взялись а они лишние, точно) -исходники прилагаются HttpProxyServer |
несколько человек добавили в репу с примерно следующим коментарием
Цитата:
|
> причем тут блокнот это первый опыт в сетевом кодинге я просил посмотреть и высказать мнения, указать слабые места, показать как лучше.
НИКАК не лучше и НИКАК не хуже потому что это просто ПРОКСИ, сорцов которого полно в инете на каждом сайте. > -язык с+api поведуй, что это а язык такой c+api? хотя знаешь, тупости я в сорцах немного нашел. видимо это свойство интересного языка c+api, НО Код:
какой ещё GetDlgItemTextA() ? сделай флаг g_bStarted = TRUE/FALSE; и всё далее Код:
void CenterWindow(HWND hWnd)и вот это тупо тоже Код:
while(strncmp(cBuf+iResult-4,"\r\n\r\n",4));РАЗМЕР У тебя рантайм используется. Отключай #pragma comment(linker,"/entry:EntryPoint") void EntryPoint( void ) // точка входа в WM_COMMAND:IDCANCEL Код:
WSACleanup();а в обработчике WM_CLOSE делать ExitProcess() или PostQuitMessage( 0 ); ещё нужно вызывать TerminateThread( hThread, 0 ); иначе нахер ты сохраняешь хенлд созданого потока? и ещё, поставил бы ты таймауты на поток, обслуживающий клиент. |
Про размер я уже 100 раз писал! Больше писать не буду. Буду давать ссылку на свой пост на WASM.RU:
http://wasm.ru/forum/viewtopic.php?pid=188444#p188444 |
Код:
char *cHost=(char *)malloc(HOST_SIZE); |
блин, весь вечер убил на то чтобы перевести cpp>>delphi, людей подключил, в сё зря :mad:
исходник не работает на Delphi7 и как оказалось на срр тоже, все компилиться, врожде создаеться сервер, но при включении и использовании ничего не получаеться. переведенный исходник тут . исправь код! |
Цитата:
с HOST_SIZE+1 начанается переполнение стека и возможность выполнить произвольный код... причем сервер падает у меня при использовании Firefox'ом 2.0.0.4 при первом же запросе, и я даже не разбирался почему) |
Открыл код... сразу бросилась в глаза передача сокетов по ссылке.. вопрос - нафига?
Далее if(!strcmp(cStatServ,"Start Server")) это жесть. Ставить флаг быстрее будет Код:
struct sockaddr_in saddr;2) Нафига делать htonl(INADDR_ANY)? Тем более что inaddr_any=0 3) не sizeof(struct sockaddr), а sizeof(struct sockaddr_in). Код:
doКод:
struct sockaddr_in saddr; |
> 1) А кто очистит sin_zero ?
а его не надо очищать > 3) не sizeof(struct sockaddr), а sizeof(struct sockaddr_in). в Windows 95, 98, NT, XP и тд некритично. вообще обычно делаю sizeof( s_a ) где s_a типа sockaddr_in > 2) Нафига делать htonl(INADDR_ANY)? Тем более что inaddr_any=0 да это тупость) > if((saddr.sin_addr.s_addr=inet_addr("cHost"))==INA DDR_NONE) ага, это я не заметил... напоминает php ; ) А про переполнения отдельная тема.. везде где можно они есть) |
Цитата:
Цитата:
Цитата:
|
в MAC OS насколько я понимаю критично sizeof( sockaddr ) != sizeof( sockaddr_in )
> Я пробовал не очищать, оно ругается. ругается? всю жизнь не ругалось) s_a.sin_family = AF_INET; s_a.sin_port = htons( 80 ); s_a.sin_addr.s_addr = inet_addr( ip ); вот и все что нужно, всегда так делал... s_a в стеке, там был мусор. |
Цитата:
и strstr тем же смотри у всего cBuf наличие \r\n\r\n, а не strncmp, так как данные могу поступать как угодно. 2KEZ ну и наверняка без наличия "Host: " будет идти чтение с не зарезервированного участка памяти, что к ошибке рантайм должно привести. |
Цитата:
|
NetMan, у стандартных функций типа strcpy есть безопасные аналоги, которые позволяют ограничивать размер, таже strncpy, другое дело, что ТС не правильно ее использует.
|
Большое спасибо за коментарии, критику учту, хотя во многих постах чуствовалаль почемута некоторая агрессия, это все таки "первый блин". По поводу работоспособности я с ним пару часов серфил на опере, не скажу что было очень стабильно но работало. по поводу /r/n/r/n это в процессе написания была некоторая проблема из- за чего применялась такая конструкция для отладки потом ее исправил но видимо выложил не исправленную версию.
а по поводу замены констант ну это просто облегчает читаемость все равно же в ехе будет число на этом месте. >> if((saddr.sin_addr.s_addr=inet_addr("cHost"))==INA DDR_NONE) >>Ой это вообще без комментариев. Это не работает 100%. Что называется "полный П" причем тут пхп просто кавычки забыл убрать и все >>saddr.sin_addr.s_addr=htonl(INADDR_ANY); да действительно херня получилась... |
если я еще не всех доеп (помоему здесь все какие то вспыльчивые) может кто нибудь посоветовать как проверить состояние сокета потому как если клиент отправил данные но не закрыл сокет ф-я reсvостанавливает выполнение программы. в гет-запросе проблем никаких достаточно найти /r/n/r/n а вот пост-запрос еще шлет длину запроса а вымерять ее как то не хочеться
|
| Время: 23:13 |