![]() |
|
Модераторы: feodorv |
![]()
|
|
| Fantaz1 |
|
||||
![]() Новичок Профиль Группа: Участник Сообщений: 44 Регистрация: 16.1.2009 Репутация: нет Всего: нет |
Начал разбираться с сокетами и в самом начале застрял на элементарном, с функциями send и recv, в програмке в которой сервер отправляет сообщения на клиент и там оно выводится на экран...
Вот коды двух программ. Сервер:
Клиент:
Кто подскажет в чем ошибка?? Почему не отправляются данные?? |
||||
|
|||||
| SenkraD |
|
||||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 933 Регистрация: 3.2.2006 Где: Украина::Киев Репутация: 1 Всего: 23 |
и что вы этим отослать пытаетесь? 64 байта с адресса некого указателя?
|
||||
|
|||||
| Fantaz1 |
|
|||
![]() Новичок Профиль Группа: Участник Сообщений: 44 Регистрация: 16.1.2009 Репутация: нет Всего: нет |
SenkraD исправил ваши замечания, но это не помогло:( Все равно зависает на recv()/send().. То есть сразу возвращает SOCKET_ERROR в этих методах.
Это сообщение отредактировал(а) Fantaz1 - 19.7.2010, 09:46 |
|||
|
||||
| SenkraD |
|
|||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 933 Регистрация: 3.2.2006 Где: Украина::Киев Репутация: 1 Всего: 23 |
а что выдаёт GetLastError()?
|
|||
|
||||
| Fantaz1 |
|
|||
![]() Новичок Профиль Группа: Участник Сообщений: 44 Регистрация: 16.1.2009 Репутация: нет Всего: нет |
в сервере ошибку №10057
в клиенте ошибку №10054 Это сообщение отредактировал(а) Fantaz1 - 19.7.2010, 10:30 |
|||
|
||||
| SenkraD |
|
||||||||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 933 Регистрация: 3.2.2006 Где: Украина::Киев Репутация: 1 Всего: 23 |
10057:
10054:
так нашёл косяк в серваке:
нужно
Это сообщение отредактировал(а) SenkraD - 19.7.2010, 11:04 |
||||||||
|
|||||||||
| Fantaz1 |
|
|||
![]() Новичок Профиль Группа: Участник Сообщений: 44 Регистрация: 16.1.2009 Репутация: нет Всего: нет |
SenkraD СПАСИБО ОГРОМНОЕ добрый человек!!!
|
|||
|
||||
| hoshin |
|
||||
|
Новичок Профиль Группа: Участник Сообщений: 17 Регистрация: 10.5.2010 Репутация: нет Всего: нет |
Начал изучать сокеты и так же остановился на самых элементарных вещах.
пример взятый с этой ссылки Секреты поваров компьютерной кухни или ПК: решение проблем, первый примитивный пример клиент-сервер с книги "Снейдер Й. - Эффективное программирование TCP-IP" весгда выдают одни и те же ошибки error LNK2019: unresolved external symbol __imp__recv@16 referenced in function _main error LNK2019: unresolved external symbol __imp__send@16 referenced in function _main error LNK2019: unresolved external symbol __imp__connect@12 referenced in function _main error LNK2019: unresolved external symbol __imp__socket@12 referenced in function _main error LNK2019: unresolved external symbol __imp__inet_addr@4 referenced in function _main error LNK2019: unresolved external symbol __imp__htons@4 referenced in function _main C:\Debug\tcp book.exe : fatal error LNK1120: 6 unresolved externals Build log was saved at "file://c:\\Debug\BuildLog.htm" book - 7 error(s), 0 warning(s) и данный пример, который Вы только что разбирали выше так же выдал такие ошибки. Может кто подскажет, что делаю не так. Пишу на MSVS 2005. вот код, который например полностью выписан с книги Снейдера Й., выдает все эти семь ошибок. клиент
сервер
при игнорировании этих ошибок, выдает сообщение, что Unable to start program c:\book.exe "Не удается найти указаный файл" Подскажите пожалуйста, что делать... |
||||
|
|||||
| null56 |
|
|||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 721 Регистрация: 19.3.2008 Репутация: нет Всего: 12 |
это ошибки линковки, надо подключить библиотеку сокетов, посмотри в мсдн, как она называется
Добавлено @ 19:24 добавь в начало кода после инклюдов
Это сообщение отредактировал(а) null56 - 4.8.2010, 19:26 |
|||
|
||||
| hoshin |
|
||||||
|
Новичок Профиль Группа: Участник Сообщений: 17 Регистрация: 10.5.2010 Репутация: нет Всего: нет |
Спасибо тебе Добрый Человек!!!! только может знаете в книге автор написал в коде сервера -
и в консоли выводится сообщение "err listen : No error" посмотрел значение rc и SOCKET_ERROR - rc = 4294967295; SOKET_ERROR = -1; автор описал функцию listen() так: int listen(SOCKET s, int backlog); Возвращаемое значение: SOCKET_ERROR (для Windows) - ошибка. Подскажите кокое должно быть возвращаемое значение rc и SOCKET_ERROR - которое показывает, что ошибок нет. или была опечатка, которую надо исправить на if( !rc ) {...}; |
||||||
|
|||||||
| Modul |
|
||||
![]() Бывалый ![]() Профиль Группа: Участник Сообщений: 238 Регистрация: 17.2.2006 Репутация: нет Всего: нет |
При возникновении ошибки listen() возвращает -1, SOCKET_ERROR = -1.
--------------------
I'll be back ! |
||||
|
|||||
| hoshin |
|
||||||||||||||
|
Новичок Профиль Группа: Участник Сообщений: 17 Регистрация: 10.5.2010 Репутация: нет Всего: нет |
тогда, из-за чего получается так, что выражение ( rc == -1 ), является истинным пример 1.
или как предлагал Modul, так же выражение (listen(sockfd, BACKLOG) == -1) является истинным пример 2.
, а когда пишу вот так пример 3.
выражение (rc < 0) не является истинным, т.е. тут rc > 0... когда решил проверить значение rc и получил такой ответ cout << "rc = " << rc; // rc = 4294967295; подскажите, из-за чего так получается, не пойму, ведь из первых двух вариантов listen() возвращал -1 (т.е. меньше нуля), что является признаком ошибки, а в третьем варианте возвращает не -1, что является признаком нормальной работы. P.S. после этого примера полностью запутался
выражение оператора if(rc < 0 || rc == -1) тут является истинным, тогда почему if(rc < 0) не является истинным (теретий пример)... |
||||||||||||||
|
|||||||||||||||
| SenkraD |
|
|||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 933 Регистрация: 3.2.2006 Где: Украина::Киев Репутация: 1 Всего: 23 |
hoshin, ну в последнем случае у вас if сработает если хотя бы одно условия сработает!!!
Какой тип имеет rc? не unsigned xxx часом? - если да, то тогда всё понятно: он никогда не может быть меньше нуля, а проверку равентсва проходит из-за того, что -1 автоматом кастуется к unsigned типу |
|||
|
||||
| Modul |
|
||||
![]() Бывалый ![]() Профиль Группа: Участник Сообщений: 238 Регистрация: 17.2.2006 Репутация: нет Всего: нет |
В режиме слушания сервера (listen) эта функция возвращает 0, при возникновении ошибки =-1.
Вопросы отпали ??? Вот так правильно:
или
Это сообщение отредактировал(а) Modul - 5.8.2010, 15:14 --------------------
I'll be back ! |
||||
|
|||||
| hoshin |
|
||||||||||
|
Новичок Профиль Группа: Участник Сообщений: 17 Регистрация: 10.5.2010 Репутация: нет Всего: нет |
во всех примерах rc имеет тип SOCKET, хотя в книге был int, изменли int на SOCKET, из-за того, что
мой компилятор ругался c:\serv.cpp(22) : warning C4244: '=' : conversion from 'SOCKET' to 'int', possible loss of data но когда изменил int s на SOCKET s, перестал ругаться... или когда делая так
так же переставал ругаться как надо правильно, так? пример 1.
или так? пример 2.
есть ли между этими двумя примерами существенная разница? |
||||||||||
|
|||||||||||
| Modul |
|
||||
![]() Бывалый ![]() Профиль Группа: Участник Сообщений: 238 Регистрация: 17.2.2006 Репутация: нет Всего: нет |
И так и так верно, но 2-й вариант родной.
Это сообщение отредактировал(а) Modul - 5.8.2010, 15:19 --------------------
I'll be back ! |
||||
|
|||||
| hoshin |
|
||||||
|
Новичок Профиль Группа: Участник Сообщений: 17 Регистрация: 10.5.2010 Репутация: нет Всего: нет |
из двух примеров работает только второй с SOCEKT, а первый ругается warning C4244: '=' : conversion from 'SOCKET' to 'unsigned int', possible loss of data но так понимаю, что тип SOCKET имеет тип unsigned int. только из-за чего компилятор ругается, он что хочет, что бы я все равно явно преобразовал тип возвращаемого значения (!!!) s = (unsigned int)socket( AF_INET, SOCK_STREAM, 0); после чего он перестает ругаться... и не будет ли такое действие ошибкой с моей стороны... ведь в книге автор четко написал, что s имеет тип int, и ни каких действий больше не надо делать..... |
||||||
|
|||||||
| Alca |
|
||||||
|
Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 3993 Регистрация: 14.6.2006 Репутация: 1 Всего: 50 |
Это сообщение отредактировал(а) Alca - 5.8.2010, 16:25 |
||||||
|
|||||||
| Modul |
|
||||
![]() Бывалый ![]() Профиль Группа: Участник Сообщений: 238 Регистрация: 17.2.2006 Репутация: нет Всего: нет |
Так точно не будет ошибкой:
Ну мало ли пишут. Читай туторы лучше. --------------------
I'll be back ! |
||||
|
|||||
| hoshin |
|
|||
|
Новичок Профиль Группа: Участник Сообщений: 17 Регистрация: 10.5.2010 Репутация: нет Всего: нет |
вот автор пишет
может Вы знаете какое должно быть у INVALID_SOCKET значение, которое указывает, что с функцией socket(), что-то не в порядке... или какое значение должно возвращать функция socket(), которое так же показывает на ошибку. автор как Вы видите этого не пишет, а в инете на это особо не обращают внимание.... в моём примере INVALID_SOCKET = 4294967295; и возвращаемое значение функции socket(), так же равно 4294967295. так что это означает ошибка или наоборот, это значение (4294967295) показывает, что все хорошо? |
|||
|
||||
| null56 |
|
||||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 721 Регистрация: 19.3.2008 Репутация: нет Всего: 12 |
я лишь могу предположить, что 4294967295(dec) == 11111111111111111111111111111111(bin) == -1(dec) иными словамами, у тебя возвращается значение -1, что означает ошибку. Положительное значение ошибки у тебя из - за того, что ты используешь unsigned int в качестве типа переменной сокета, хотя вроде бы надо использовать чистый int Добавлено через 6 минут и 26 секунд кстати, об этом тебя предупреждал компилятор
|
||||
|
|||||
| null56 |
|
|||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 721 Регистрация: 19.3.2008 Репутация: нет Всего: 12 |
и об этом вам писал ранее
SenkraD |
|||
|
||||
| Олег2005 |
|
|||
|
Опытный ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 421 Регистрация: 26.5.2005 Где: Рига Латвия Репутация: 6 Всего: 11 |
||||
|
||||
| hoshin |
|
||||
|
Новичок Профиль Группа: Участник Сообщений: 17 Регистрация: 10.5.2010 Репутация: нет Всего: нет |
Всё разобрался, как можно отправлять сообщения между сервером и клиентом на одном компьютере.
Большое спасибо всем кто помог мне в этом. Но только, когда решил отправить эти сообщения через инет между двумя компами (которые находятся в разных городах), не получается... Компьютер на котором был запущен сервер, подключен к локальной сети, у которой есть АДСЛ выход в интернет, его ip-адрес, сейчас точно не скажу, (узнавал ip-адрес через сайт 2ip.ru), например 1.1.1.1. Клиент был запущен так же на компьютере с такой же топологией сети, как и у серевера, его адрес , например 2.2.2.2. (описал все это, т.к. подумал, может это надо, что бы Вы поняли, из-за чего у меня ошибка)... Как понял, для отправки через инет, нужно было заменить в клиенте код с
на
но положительного результата не получил... Так подума, потому что скачал пример сокета с сайта www.sources.codenet.ru, и там для отправки сообщений был заданы именно такие параметры. Может кто знает, что необходимо мне сделать, что бы все заработало, или поделиться каллоритной ссылкой... (сейчас учусь на MSVS 2005). Это сообщение отредактировал(а) hoshin - 9.8.2010, 18:09 |
||||
|
|||||
| Олег2005 |
|
|||
|
Опытный ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 421 Регистрация: 26.5.2005 Где: Рига Латвия Репутация: 6 Всего: 11 |
Вроде замена верная.
В первую очередь надо смотреть файрволл - пропускает ли он запрос от клиента |
|||
|
||||
| hoshin |
|
|||
|
Новичок Профиль Группа: Участник Сообщений: 17 Регистрация: 10.5.2010 Репутация: нет Всего: нет |
Вы знаете, ни разу не настраивал файрволл.
Может в двух словах сможете объяснить как мне необходимо насторить файрволл для моего случая. Только одна ситуация у меня на одном компьютере стоит Windows 7 (она основная) и запущена виртуальная Windows XP (virtual box). На Win 7 запущен TCP-сервер, на Win XP TCP-клиент. Когда первый раз запускал их (т.е. сервер и клиент) у меня на Win7 и на WinXP спрашивали (как теперь понял - это был брэндмауэр) "Хотите ли вы запустить эти прогаммы?"(что-то в этом духе). Тогда помню нажал кнопку "Разблокировать", после этого когда теперь запускаю их, система уже не спрашивает. Что мне делать подскажите?... P.S. знаю что этот вопрос не подходит для раздела "С/C++ сети". но все таки - в двух словах... |
|||
|
||||
| Олег2005 |
|
|||
|
Опытный ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 421 Регистрация: 26.5.2005 Где: Рига Латвия Репутация: 6 Всего: 11 |
На запуск программы обычно реагирует не файрволл, а антивирус. У вас они установлены?
Самый конечно "простой" в кавычках метод - поставить на комп сниффер - и посмотреть, уходят ли вообще пакеты в сеть. Этот способ 100%-ный. Насчет настройки файрволла - посмотрите в сети - у меня он отключен так как стоит Комодо и я им не пользуюсь... Добавлено через 2 минуты и 36 секунд Так что, все таки все программы на одной и той же машине? Что то непонятно что где..... Это сообщение отредактировал(а) Олег2005 - 9.8.2010, 22:48 |
|||
|
||||
![]()
|
| 0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей) | |
| 0 Пользователей: | |
| « Предыдущая тема | C/C++: Сети | Следующая тема » |
|
|
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности Powered by Invision Power Board(R) 1.3 © 2003 IPS, Inc. |