| Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате |
| Форум программистов > C/C++: Сети > клиент+сервер |
| Автор: _par 25.1.2007, 18:24 | ||||
| Недавно начал учить C++ пытаюсь написать программу типа клиент сервер под windows. Нашел примеры клиента и сервера тут проблема в том , что неполучается откомпилировать TCP сервер. Изпользую Dev-C++. Клиент
Сервер
Подкиньте матерьял по сокетам или примеры по доходчивой реализации такой программы. |
| Автор: kirjanov 25.1.2007, 19:09 |
| _par, на что компилятор ругается? |
| Автор: _par 25.1.2007, 19:18 |
| Вот ошибки ну синтаксис я пытался изправить.. 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 26.1.2007, 14:36 |
| у тебя компилятор не может найти .h файлы, посмотри, как можно ему указать, где смотреть хидеры. Последняя ошибка - что-то со скобками неправильно. |
| Автор: witex 26.1.2007, 17:44 |
| Точно, что именно компилятор не находит хидер, или просто н при линкован obj файл! потому что пример занком! Крисса Касперски. Так что у него пример рабочий! |
| Автор: _par 26.1.2007, 21:58 |
| да я всё подгружаю... Осталась последняя ошибка. [Warning] passing NULL used for non-pointer converting 2 of `void* CreateThread(_SECURITY_ATTRIBUTES*, DWORD, DWORD (*)(void*), void*, DWORD, DWORD*)' ктонибудь знает чё он ругается,как исправить ? |
| Автор: _par 27.1.2007, 00:15 |
| Все разобрался, всем огромное спасибо!! |
| Автор: Maugle 6.3.2011, 19:14 |
| Интереснро спусть 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 7.3.2011, 13:58 |
| либу подключил для WinSock2 ? #pragma comment(lib, "ws2_32.lib") |
| Автор: Townsmen 11.9.2011, 14:55 | ||
| Примеры из первого поста как я понял взят с citforum.ru/book/cook/winsock.shtml Исправил ошибки в коде сервера, может кому надо будет:
|
| Автор: bazilio 10.4.2012, 23:35 | ||
| Возник вопрос по работе с winsock. Использую пример из книги Касперски К. который выложен выложен в первом посте, поэтому и решил написать в этой теме. В коде сервера
переводим сервер в режим ожидания функцией listen, параметры - дескриптор сокета и размер очереди. Проблема в том, что мне ни как не удается ограничить кол-во подключающихся клиентов. В примере, как я понимаю, размер очереди указан в шестнадцатеричном представлении, пробовал ставить просто "1" - не помогает, может кто подскажет в чем дело? |
| Автор: Олег2005 11.4.2012, 08:51 |
| Функция 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 11.4.2012, 10:57 | ||||
Как я понимаю, при переполненной очереди, клиент будет отправлять SYN-сегмент пока не закончится таймаут. Но если очередь переполнена, то сервер не должен отвечать клиенту, а в этой программе клиенты свободно подключаются при любых значениях backlog.
Но если закрыть сокет, то сервер больше вообще не будет принимать запросы, а мне необходимо, что бы сервер обслуживал ограниченное количество клиентов, и при отключении их, мог принять других до заполнения очереди. Возможно ли это реализовать используя данный пример клиент-сервера? |
| Автор: bazilio 13.4.2012, 16:40 | ||||
| Пробовал различные варианты - на одной машине; клиент из локалки; клиент из внешней сети; Со скоростью не эксперементировал - клиент подключается и ожидает ввода данных что бы их отправить серверу, т.е. получается что:
Вообщем, backlog ограничивает количество клиентов одновременно обращающихся к серверу, я же думал, что можно будет ограничить количество подключений. Вариант интересный, буду пробовать. Еще есть идея использовать счетчик клиентов из примера:
По результатам обязательно отпишусь, думаю кому нибудь пригодится. |
| Автор: Олег2005 13.4.2012, 19:08 | ||
Именно так. |