![]() |
Модераторы: feodorv |
![]() ![]() ![]() |
|
_par |
|
||||
Новичок Профиль Группа: Участник Сообщений: 49 Регистрация: 25.1.2007 Репутация: нет Всего: нет |
Недавно начал учить C++ пытаюсь написать программу типа клиент сервер под windows.
Нашел примеры клиента и сервера тут проблема в том , что неполучается откомпилировать TCP сервер. Изпользую Dev-C++. Клиент
Сервер
Подкиньте матерьял по сокетам или примеры по доходчивой реализации такой программы. |
||||
|
|||||
kirjanov |
|
|||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 326 Регистрация: 22.1.2006 Где: Dark wood of erro r Репутация: нет Всего: 15 |
_par,
на что компилятор ругается? |
|||
|
||||
_par |
|
|||
Новичок Профиль Группа: Участник Сообщений: 49 Регистрация: 25.1.2007 Репутация: нет Всего: нет |
Вот ошибки
ну синтаксис я пытался изправить.. In function `main': `sockaddr_in' undeclared (first use in this function) (Each undeclared identifier is reported only once for each function it appears in.) syntax error before "local_addr" `local_addr' undeclared (first use in this function) sockaddr' undeclared (first use in this function) syntax error before ')' token syntax error before "client_addr" `client_addr' undeclared (first use in this function) syntax error before ')' token too few arguments to function `accept' syntax error before ')' token [Warning] passing arg 2 of `CreateThread' makes integer from pointer without a cast [Warning] passing arg 5 of `CreateThread' makes integer from pointer without a cast At top level: syntax error before "return" In function `SexToClient': syntax error before "bytes_recv" syntax error before ')' token [Build Error] [client.o] Error 1 |
|||
|
||||
kirjanov |
|
|||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 326 Регистрация: 22.1.2006 Где: Dark wood of erro r Репутация: нет Всего: 15 |
у тебя компилятор не может найти .h файлы, посмотри, как можно ему указать, где смотреть хидеры.
Последняя ошибка - что-то со скобками неправильно. |
|||
|
||||
witex |
|
|||
![]() Бывалый ![]() Профиль Группа: Участник Сообщений: 224 Регистрация: 16.10.2006 Где: Эстония Репутация: 1 Всего: 4 |
Точно, что именно компилятор не находит хидер, или просто н при линкован obj файл! потому что пример занком! Крисса Касперски. Так что у него пример рабочий!
--------------------
Я не волшебник, я только учусь."Шлёпни в Гугл" - Афтор Былов Ю.М. |
|||
|
||||
_par |
|
|||
Новичок Профиль Группа: Участник Сообщений: 49 Регистрация: 25.1.2007 Репутация: нет Всего: нет |
да я всё подгружаю... Осталась последняя ошибка.
[Warning] passing NULL used for non-pointer converting 2 of `void* CreateThread(_SECURITY_ATTRIBUTES*, DWORD, DWORD (*)(void*), void*, DWORD, DWORD*)' ктонибудь знает чё он ругается,как исправить ? |
|||
|
||||
_par |
|
|||
Новичок Профиль Группа: Участник Сообщений: 49 Регистрация: 25.1.2007 Репутация: нет Всего: нет |
Все разобрался, всем огромное спасибо!!
![]() Это сообщение отредактировал(а) _par - 27.1.2007, 00:16 |
|||
|
||||
Maugle |
|
|||
Новичок Профиль Группа: Участник Сообщений: 1 Регистрация: 6.3.2011 Где: Беларусь Репутация: нет Всего: нет |
Интереснро спусть 4 года тут кто нить ответит на вопросы или нет? ))
Жаль автор не описал как он исправил ошибки и не предоставил полностью рабочий текст. Ввиду этого я вот скопипастил текст проги у меня следующие ошибки: Сервер: In function `int main(int, char**)': passing NULL used for non-pointer converting 2 of `void* CreateThread(_SECURITY_ATTRIBUTES*, DWORD, DWORD (*)(void*), void*, DWORD, DWORD*)' passing NULL used for non-pointer converting 5 of `void* CreateThread(_SECURITY_ATTRIBUTES*, DWORD, DWORD (*)(void*), void*, DWORD, DWORD*)' In function `DWORD SexToClient(void*)': expected primary-expression before "int" expected `)' before "int" expected `)' before ';' token Клиент: [Linker error] undefined reference to `WSAStartup@8' [Linker error] undefined reference to `WSAGetLastError@0' [Linker error] undefined reference to `socket@12' [Linker error] undefined reference to `htons@4' [Linker error] undefined reference to `inet_addr@4' [Linker error] undefined reference to `inet_addr@4' [Linker error] undefined reference to `gethostbyname@4' [Linker error] undefined reference to `closesocket@4' [Linker error] undefined reference to `WSACleanup@0' [Linker error] undefined reference to `connect@12' ну еще много похожих строк... в конце ld returned 1 exit status Помогите кто-нить, а то надо лабу сделать (Домино по сети), а препод дает примеры не рабочие из нэта скопированные. Зарание огромное спасибо!!! |
|||
|
||||
Modul |
|
|||
![]() Бывалый ![]() Профиль Группа: Участник Сообщений: 238 Регистрация: 17.2.2006 Репутация: нет Всего: нет |
либу подключил для WinSock2 ?
#pragma comment(lib, "ws2_32.lib") --------------------
I'll be back ! |
|||
|
||||
Townsmen |
|
|||
![]() Шустрый ![]() Профиль Группа: Участник Сообщений: 65 Регистрация: 20.7.2011 Репутация: нет Всего: 1 |
Примеры из первого поста как я понял взят с citforum.ru/book/cook/winsock.shtml
Исправил ошибки в коде сервера, может кому надо будет:
Это сообщение отредактировал(а) Townsmen - 11.9.2011, 14:57 |
|||
|
||||
bazilio |
|
|||
Новичок Профиль Группа: Участник Сообщений: 8 Регистрация: 8.6.2010 Где: Обнинск Репутация: нет Всего: нет |
Возник вопрос по работе с winsock. Использую пример из книги Касперски К. который выложен выложен в первом посте, поэтому и решил написать в этой теме.
В коде сервера
переводим сервер в режим ожидания функцией listen, параметры - дескриптор сокета и размер очереди. Проблема в том, что мне ни как не удается ограничить кол-во подключающихся клиентов. В примере, как я понимаю, размер очереди указан в шестнадцатеричном представлении, пробовал ставить просто "1" - не помогает, может кто подскажет в чем дело? |
|||
|
||||
Олег2005 |
|
|||
![]() Опытный ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 421 Регистрация: 26.5.2005 Где: Рига Латвия Репутация: 6 Всего: 11 |
Функция listen() описывается так:
int listen(int sd, int backlog); где sd – дескриптор сокета, backlog – задает максимальный размер очереди для приходящих запросов соединения (то есть, сколько запросов может быть принято на обслуживание без потерь, обычно этот параметр равен 5). При переполнении очереди будет послано сообщение об ошибке. До сих пор рекомендуемая максимальная длина очереди для многих реализаций равна пяти. Если в настройках стека попытаться указать большее число, то можно в зависимости от реализации или получить сообщение об ошибке, или нет. На самом деле во многих TCP-модулях различных ОС истинное значение длины очереди буфера для приема входящих соединений расчитывается по формуле: backlog * 3 / 2 + 1 и listen(sd, 0) разрешит принять одно соединение, listen (sd, 5) - 8. Система Solaris интерпретирует listen(sd,0) как запрет на прием заявок, BSD интерпретирует как (0*3/2+1 = 1) – одно соединение. Отрицательное значение backlog практически во всех реализациях трактуется как 0. Если очередь при поступлении нового запроса окажется переполненной, то модуль TCP не ответит посылкой сегмента RST, а просто отвергнет его, и программа-клиент сможет еще несколько раз слать свой SYN-сегмент (см. описание внутреннего таймаута функции connect()). Если необходимо при работающем сервере послать именно RST, надо просто закрыть слушающий сокет. Примечание Современные стеки TCP/IP позволяют устанавливать значение backlog на несколько порядков выше. Формула расчета полной очереди буферов тоже может меняться. |
|||
|
||||
bazilio |
|
||||
Новичок Профиль Группа: Участник Сообщений: 8 Регистрация: 8.6.2010 Где: Обнинск Репутация: нет Всего: нет |
Как я понимаю, при переполненной очереди, клиент будет отправлять SYN-сегмент пока не закончится таймаут. Но если очередь переполнена, то сервер не должен отвечать клиенту, а в этой программе клиенты свободно подключаются при любых значениях backlog.
Но если закрыть сокет, то сервер больше вообще не будет принимать запросы, а мне необходимо, что бы сервер обслуживал ограниченное количество клиентов, и при отключении их, мог принять других до заполнения очереди. Возможно ли это реализовать используя данный пример клиент-сервера? |
||||
|
|||||
Олег2005 |
|
||||
![]() Опытный ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 421 Регистрация: 26.5.2005 Где: Рига Латвия Репутация: 6 Всего: 11 |
Несколько вопросов. 1. Какая структура сети - т.е. расположены ли все клиенты - и сервер - в одной локалке или на одной машине 2. С какой скоростью(иначе не придумать названия) клиенты бомбят сервер? Потому как есть вариант - особенно при моделировании - что сервер успевает быстро обработать заявку на соединение - и потому очередь не переполняется. Добавлено через 6 минут и 14 секунд
Сделать это наверно не совсем просто. Я бы предложил "кривой" вариант - использовать простой счетчик подключений (сколько прошло accept) При этом надо использовать SOCKET WSAAPI WSAAccept ( IN SOCKET sd, OUT struct sockaddr FAR * addr, IN OUT LPINT addrlen, IN LPCONDITIONPROC lpfnCondition, IN DWORD dwCallbackData); Здесь: · addr - необязательный указатель на буфер (структуру), где должен храниться адрес подключаемого объекта; формат адреса определяется типом протокола, заданным при создании сокета; · addrlen - необязательный указатель на целую переменную, которая определяет длину аргумента addr; · lpfnCondition - адрес необязательный процедуры, которая на основе анализа некоторых условий (например, нежелательный IP-адрес) возвращает CF_ACCEPT для приема, CF_REJECT для отказа обслуживания запроса или CF_DEFER для отложенного анализа. На основе анализа возврата WSAAccept() принимает решение о дальнейшей обработке, или о создании группы сокетов, или подключает сокет к уже существующей группе. Например, надо отказаться от обслуживания запроса. Функция анализа возвращает CF_REJECT и WSAAccept() в свою очередь возвращает INVALID_SOCKET с кодом ошибки WSAECONNREFUSED. Режим вызова процедуры, адресованной lpfnCondition, осуществляется установкой опции прослушивающего сокета SO_CONDITIONAL_ACCEPT (тип - BOOL). Использование этого режима снижает нагрузку на сеть и повышает устойчивость сервера против атак. · DwCallbackData - параметр, возвращаемый приложению. Этот параметр не интерпретируется WinSock. |
||||
|
|||||
bazilio |
|
||||
Новичок Профиль Группа: Участник Сообщений: 8 Регистрация: 8.6.2010 Где: Обнинск Репутация: нет Всего: нет |
Пробовал различные варианты - на одной машине; клиент из локалки; клиент из внешней сети;
Со скоростью не эксперементировал - клиент подключается и ожидает ввода данных что бы их отправить серверу, т.е. получается что:
Вообщем, backlog ограничивает количество клиентов одновременно обращающихся к серверу, я же думал, что можно будет ограничить количество подключений. Вариант интересный, буду пробовать. Еще есть идея использовать счетчик клиентов из примера:
По результатам обязательно отпишусь, думаю кому нибудь пригодится. |
||||
|
|||||
![]() ![]() ![]() |
1 Пользователей читают эту тему (1 Гостей и 0 Скрытых Пользователей) | |
0 Пользователей: | |
« Предыдущая тема | C/C++: Сети | Следующая тема » |
|
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности Powered by Invision Power Board(R) 1.3 © 2003 IPS, Inc. |