320 / 280 / 109
Регистрация: 27.09.2010
Сообщений: 1,058
|
||||||
1 | ||||||
Отладка TCP соединения06.05.2013, 23:33. Показов 3164. Ответов 18
Метки нет (Все метки)
Всем привет. Народ, посмотрите со стороны на мой код, кто разбирается. У меня глючит клиентская часть TCP:
0
|
06.05.2013, 23:33 | |
Ответы с готовыми решениями:
18
Реализовать на tcp сокетах переподключение к tcp серверу в случае потери соединения Закрытие tcp соединения на хосте Сцена зависает при запуске TCP-клиента, когда он подключен к TCP - серверу, при этом TCP-клиент полностью функционирует Не прерываются Tcp соединения |
07.05.2013, 10:04 | 2 | ||||||||||
Для начала....
0
|
320 / 280 / 109
Регистрация: 27.09.2010
Сообщений: 1,058
|
|
07.05.2013, 18:58 [ТС] | 3 |
0
|
192 / 199 / 82
Регистрация: 11.04.2013
Сообщений: 1,086
|
||||||
07.05.2013, 19:11 | 4 | |||||
titans2011,
0
|
320 / 280 / 109
Регистрация: 27.09.2010
Сообщений: 1,058
|
||||||||||||||||
07.05.2013, 19:34 [ТС] | 5 | |||||||||||||||
Как попробую, отпишусь.
Добавлено через 21 минуту Так дело в том, что сокет там полностью закрывается. И потом заново открывается. Я как раз и заметил, что
0
|
192 / 199 / 82
Регистрация: 11.04.2013
Сообщений: 1,086
|
||||||||||||||||
07.05.2013, 19:46 | 6 | |||||||||||||||
titans2011,
А вот теперь обрабатываем
titans2011, асинхронные операции выполняются в разных!!! потоках (т.е. фактически параллельно) что делаешь ты
0
|
320 / 280 / 109
Регистрация: 27.09.2010
Сообщений: 1,058
|
|
07.05.2013, 20:27 [ТС] | 7 |
Исключено. Прежде всего я жду ответа. Если он не приходит, то значит сокеты закрыты(и я не отсылаю <end> ). Если ответ пришел, то только потом я отсылаю закрытие (фактически у меня там стоит while(true)).
P.S. Я попробую ту штуку, что ты мне говорил. Потом отпишусь как будет работать.
0
|
07.05.2013, 20:34 | 8 |
Угу. А всё из-за того, что ты выполняешь всё сразу в кучи потоках: и соединение, и отправку, и прием, и закрытие. И если закрытие сработает быстрее всех, то будет "пушной зверь песец", причем о его существовании будет знать только... да никто не будет знать, ты же всё в try-catch позасовывал без должной обработки, вот и страдаешь.
В общем - EVG-1980 вроде как уже всё объяснил.
0
|
320 / 280 / 109
Регистрация: 27.09.2010
Сообщений: 1,058
|
|
07.05.2013, 21:06 [ТС] | 9 |
Я безусловно сделаю все выше сказанные советы. Но. Проблемы как я говорил в передачи нет. Проблема возникает, когда я закрываю сокет, а потом снова вызываю Connect() и все остальное. Посмотрим, что будет после изменения.
0
|
192 / 199 / 82
Регистрация: 11.04.2013
Сообщений: 1,086
|
|
07.05.2013, 21:19 | 10 |
titans2011, По твоему коду видно что ты пытаешься соединиться, отправить, получить данные и закрыть соединение ОДНОВРЕМЕННО
Сначала надо соединиться Connect() начинаем соединяться ConnectCallback(IAsyncResult ar) { Соеденились send () - начинаем отправлять данные } SendCallback(IAsyncResult ar) { Отправили данные recive () - встаем на прием } ReceiveCallback(IAsyncResult ar) { принимаем данные socket.close() - закрываем сокет Connect() начинаем соединяться }
0
|
320 / 280 / 109
Регистрация: 27.09.2010
Сообщений: 1,058
|
|
07.05.2013, 21:32 [ТС] | 11 |
Я же говорю, там стоят вечные циклы (я их вырезал). Пока не пройдет соединение, отправить данные не получится и т.д. Можете не беспокоится. Там все идет своим чередом. Дело лишь во втором подключении.
0
|
192 / 199 / 82
Регистрация: 11.04.2013
Сообщений: 1,086
|
|
07.05.2013, 21:37 | 12 |
titans2011, набери в гугле , асинхронные сокеты или асинхронный сервер почитай
0
|
07.05.2013, 23:40 | 13 | |||||
у-у-у-у-у... Скажу только одно - нужно лицезреть весь этот ужас, чтобы понять что не так.
P.S. упрощенная модель ваших действий. можете проверить на работоспособность.
0
|
320 / 280 / 109
Регистрация: 27.09.2010
Сообщений: 1,058
|
|
08.05.2013, 09:26 [ТС] | 14 |
Вот не нужно драматизировать. Я находил примеры в MSDN, где ожидание делалось с помощью семафоров. Но ведь если будет семафор, то ожидание будет вечным, если не подключится. А для времени, нужно вводить новый поток, который переключит через пару секунд этот семафор. Не проще ли в том же потоке поставить вечный цикл, отсчитать кол-во секунд в нем, и если нет подключения- выйти из вечняка? Мне кажется это на много проще.
К стати да. Очень близко к тому, что нужно.
0
|
08.05.2013, 13:31 | 15 |
Я не драматизирую, а говорю, что "фиг поймешь что там не так". А из увиденного, могу сказать только, что непонятно зачем используются асинхронные методы в сочетании с синхронными.
0
|
320 / 280 / 109
Регистрация: 27.09.2010
Сообщений: 1,058
|
|||||||||||||||||||||
08.05.2013, 14:14 [ТС] | 16 | ||||||||||||||||||||
Значит причесал я более менее код-модель. Осталось одна деталь непонятная. Что бы у вас запустился мой код, нужно в начале клиента поменять IP сервера.
Клиент:
Добавлено через 6 минут Вот эта строка отсылает буфер. Где-то тут нужно сбрасывать его.
Все, уже разобрался.
0
|
320 / 280 / 109
Регистрация: 27.09.2010
Сообщений: 1,058
|
|
08.05.2013, 14:36 [ТС] | 18 |
Ну блин. Это не я придумал. Это пример с MSDN
0
|
08.05.2013, 14:41 | 19 |
titans2011, забей, преподу будешь это объяснять (или кому там будешь сдавать это чудо).
И блин - каюсь, но помочь с "этим" не могу: мой мозг тупо кричит "ПЕРЕПИСАТЬ" и ни в какую не хочет искать возможные баги.
0
|
08.05.2013, 14:41 | |
08.05.2013, 14:41 | |
Помогаю со студенческими работами здесь
19
Обрыв TCP соединения Получить TCP/UDP соединения для процесса Проверка соединения TCP Обрыв соединения, TCP Искать еще темы с ответами Или воспользуйтесь поиском по форуму: |