Вот собсна решил наваять и выложить на общий суд -язык с+api -открывает 31337 порт -логов не ведет -весит мало ~10к (так я не понял откуда лишних 5к взялись а они лишние, точно) -исходники прилагаются HttpProxyServer
несколько человек добавили в репу с примерно следующим коментарием причем тут блокнот это первый опыт в сетевом кодинге я просил посмотреть и высказать мнения, указать слабые места, показать как лучше.
> причем тут блокнот это первый опыт в сетевом кодинге я просил посмотреть и высказать мнения, указать слабые места, показать как лучше. НИКАК не лучше и НИКАК не хуже потому что это просто ПРОКСИ, сорцов которого полно в инете на каждом сайте. > -язык с+api поведуй, что это а язык такой c+api? хотя знаешь, тупости я в сорцах немного нашел. видимо это свойство интересного языка c+api, НО Code: if(wParam==IDSERVER) { char cStatServ[15]; GetDlgItemText(hWnd,IDSERVER,cStatServ,15); if(!strcmp(cStatServ,"Start Server")) вот это что?) (хотябы [16] элементов бы задал для правильности) какой ещё GetDlgItemTextA() ? сделай флаг g_bStarted = TRUE/FALSE; и всё далее Code: void CenterWindow(HWND hWnd) { RECT rt; GetWindowRect(hWnd,&rt); MoveWindow(hWnd, (GetSystemMetrics(SM_CXSCREEN)-rt.right)>>1, (GetSystemMetrics(SM_CYSCREEN)-rt.bottom)>>1, rt.right-rt.left, rt.bottom-rt.top, 0); } абсолютно бессмысленно - можно просто указать что диалог будет по центру, что указывается в настройках ресурса "ДИАЛОГ" и вот это тупо тоже Code: while(strncmp(cBuf+iResult-4,"\r\n\r\n",4)); если только схематично, а так нет смысла вызывать strncmp РАЗМЕР У тебя рантайм используется. Отключай #pragma comment(linker,"/entry:EntryPoint") void EntryPoint( void ) // точка входа в WM_COMMAND:IDCANCEL Code: WSACleanup(); EndDialog(hWnd,0); ExitProcess(0); неправильно, правильнее будет вызывать EndDialog() а в обработчике WM_CLOSE делать ExitProcess() или PostQuitMessage( 0 ); ещё нужно вызывать TerminateThread( hThread, 0 ); иначе нахер ты сохраняешь хенлд созданого потока? и ещё, поставил бы ты таймауты на поток, обслуживающий клиент.
Про размер я уже 100 раз писал! Больше писать не буду. Буду давать ссылку на свой пост на WASM.RU: http://wasm.ru/forum/viewtopic.php?pid=188444#p188444
Code: char *cHost=(char *)malloc(HOST_SIZE); int iHostBeg=strstr(cBuf,"Host: ")-cBuf+6; int iHostLen=strstr(cBuf+iHostBeg,"\r")-cBuf-iHostBeg; strncpy(cHost,cBuf+iHostBeg,iHostLen);
блин, весь вечер убил на то чтобы перевести cpp>>delphi, людей подключил, в сё зря исходник не работает на Delphi7 и как оказалось на срр тоже, все компилиться, врожде создаеться сервер, но при включении и использовании ничего не получаеться. переведенный исходник тут . исправь код!
ага, спрашивается зачем использовать strncpy, если указывается длинна переданой строки с HOST_SIZE+1 начанается переполнение стека и возможность выполнить произвольный код... причем сервер падает у меня при использовании Firefox'ом 2.0.0.4 при первом же запросе, и я даже не разбирался почему)
Открыл код... сразу бросилась в глаза передача сокетов по ссылке.. вопрос - нафига? Далее if(!strcmp(cStatServ,"Start Server")) это жесть. Ставить флаг быстрее будет Code: struct sockaddr_in saddr; saddr.sin_family=AF_INET; saddr.sin_port=htons(port); saddr.sin_addr.s_addr=htonl(INADDR_ANY); if(bind(*s,(sockaddr*)&saddr,sizeof(struct sockaddr))==SOCKET_ERROR) 1) А кто очистит sin_zero ? 2) Нафига делать htonl(INADDR_ANY)? Тем более что inaddr_any=0 3) не sizeof(struct sockaddr), а sizeof(struct sockaddr_in). Code: do { int i=recv(sSock,cTemp,iSize,0); if(i<1) return iResult; iResult+=i; cTemp+=i; iSize-=i; } while(strncmp(cBuf+iResult-4,"\r\n\r\n",4)); Переполнение буфера. Code: struct sockaddr_in saddr; saddr.sin_family=AF_INET; saddr.sin_port=htons(HTTP_PORT); if((saddr.sin_addr.s_addr=inet_addr("cHost"))==INADDR_NONE) { Ой это вообще без комментариев. Это не работает 100%. Что называется "полный П"
> 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"))==INADDR_NONE) ага, это я не заметил... напоминает php ; ) А про переполнения отдельная тема.. везде где можно они есть)
Я пробовал не очищать, оно ругается. Некритично вообще, ибо sizeof(sockaddr)==sizeof(sockaddr_in). Но все таки нужно писать правильно Скорее напоминает бред шизофреника)
в 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 в стеке, там был мусор.
переполнение буфера всегда лечится, а вот неправильную логику подпрограммы исправлять обычно сложнее: кто сказал что браузер пошлет запрос оканчивающийся сразу на \r\n\r\n, тут и про пост-запросы сразу забываем с таким парсингом. наверное придется проверять пост-ли это, если да, тогда смотрим поле Content-Length и продолжаем читать после \r\n\r\n ровно такое количество данных. и 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"))==INADDR_NONE) >>Ой это вообще без комментариев. Это не работает 100%. Что называется "полный П" причем тут пхп просто кавычки забыл убрать и все >>saddr.sin_addr.s_addr=htonl(INADDR_ANY); да действительно херня получилась...
если я еще не всех доеп (помоему здесь все какие то вспыльчивые) может кто нибудь посоветовать как проверить состояние сокета потому как если клиент отправил данные но не закрыл сокет ф-я reсvостанавливает выполнение программы. в гет-запросе проблем никаких достаточно найти /r/n/r/n а вот пост-запрос еще шлет длину запроса а вымерять ее как то не хочеться