Задачи написать многопоточный сервер с поддержкой тысячи клиентов у меня не стояла (хотя я его тоже написал) была задача написать мааааленький сервачек под windows, который в дальнейшем думаю допилить напильником выкинуть от туда все что можно и юзать в зловредах. Сервак в скомпилированном виде весит 3 584 байта и на момент (6.04.2010) альфа версия держит соединение типа connect если адрес задается как hostort без авторизации (ибо тестировал я на rnq, а он подключается именно так хех) Запускать с консоли так: mini_socks5.exe port Останавливать Ctrl+Alt+Del и убивать в процессах Cпасибо SLESH-у за структурки и наставление на обработку туннеля через select и Hiro Protagonist-y за мотивацию ) Жду осуждений и поправок кода ибо писал на коленке в нетбучек за паручасов. mini_socks5_0.01_src.rar - 4.68 Кб mini_socks5_0.01_bin.rar - 1.63 Кб
2 Nightmarе - перезалил исходник, компилить лень, а вот UDP там нет. Скоро планирую полноценный сервер писать для одного проекта вот там и добавлю )
Ничего личнего, но там почти что ничего нету, целиком может 7-8кб кода, работа с простыми сокетами,имхо слишком маленький код и слишком элемнтарное дело, чтобы закидывать на публик,как уже сказал ничего личнего.
R0nin маленький код потому что там ничего лиШнего ) а тут добрая часть форума вообще не слышала о сокетах и WinAPI )) а уж тем более, как запрограммировать туннель
И вот пришел дядя слеш и начал чтото толкать по коду: 1) _chkstk нафига? Тупо прибей проверку переполнений и жестко поставь размер стека который не будет проверяться. и тогда не придется юзать _chkstk. Если всётаки хочешь юзать его, то сделай импорт из стандартной виндовой msvcrt.dll которая есть везде по дефолту. 2) SOCKET sock=INVALID_SOCKET; А смысл тратить инструкции кода на забивания знаения. если после функции socket оно по любому изменится 3) addr.sin_addr.s_addr = 0; лучше юзать константы типа INADDR_ANY чтобы более наглядно было 4) Sleep(50); // не отнимаем у проца ресурсы... и тем самым снижая пропускную способность до 273 килобайт в секунду для каждого клиента. Лучший всего в таких случаях юзать механизм типа такого: Если был обмен данными хоть на одном сокете, то паузу не делать. если небыло то делать. Механизм пашет отлично. Правдо когда 18r клиентов то сильно грузит проц. ну пока хватит. более подробно не смотрел. Небольшой совет. Сделай поддержку адерсации по IP тож полезная вешь. и кода пару строк. т.е. 3 строчки кода и небольшой юнион в структуру запроса ну и не забывай правильно отвечать клиенту по возникшим ошибкам. (проверка домена, коннекта, типа команды, типа адресации итд итп)
_chkstk вылез при компиляции /GS- не помогло нихрена, а скока выделять под стек я не знаю, кто-то советовал мега большое значение. Про паузы спасибо ) как-то даже не подумал про такое )
В параметрах компиляции ставь /GsXXXX где XXXX число в байтах. Можно его поставить чуть больше чем то, сколько занимают локальные переменные. Для тебя пойдет 8192 вроде как.
только если поставиш /GsXXX больше 2 страниц и будеш писать такой код buff[0] = var; для буферов больше страницы размером то в опциях линкера при сборке укажи сразу рядом с пространством зарезервированным под стек и количество переданной сразу памяти стеку ставь тогда столько же сколько в /GsXXX написал иначе прога будет просто молча падать не сообщив об ошибке винда если видит что адрес невалидный в протранстве стека просто закрывает прогу по тихому