25 / 26 / 16
Регистрация: 27.09.2015
Сообщений: 110
|
|||||||||||
1 | |||||||||||
Функции puts(), send(), recv() и какая-то дичь13.10.2016, 18:11. Показов 2144. Ответов 9
Метки нет (Все метки)
Всем здравствовать!
Столкнулся с невероятно непонятной мне вещью и просто уже не могу... не могу разобраться. Написал я значится морской бой, и все работает, сделал игру против игрока по сети, и все работает, но до того момента как кто-то победил. Задумка была такая, когда кто-то побеждает, то строкой формируется поле победившего игрока и отправляется проигравшему игроку, чтобы тот знал, где корабли его противника, по которым он не попал. Вот как это выглядит в коде. Со стороны клиента
0
|
13.10.2016, 18:11 | |
Ответы с готовыми решениями:
9
Сокеты: после вызова send программа зависает на функции recv send(.);recv(.); send/recv Сокеты, send(), recv() |
25 / 26 / 16
Регистрация: 27.09.2015
Сообщений: 110
|
|
13.10.2016, 18:17 [ТС] | 2 |
Вот результат работы, может поможет.
0
|
25 / 26 / 16
Регистрация: 27.09.2015
Сообщений: 110
|
|
13.10.2016, 18:41 [ТС] | 3 |
А вот еще и странности при дебагинге.
Здесь ситуация такая, игрок который победит - не в дебаге, а сервер и игрок, который проиграет - в дебаге. Когда игрок побеждает, то если быстро пронажимать F10, то мы словим от победившего игрока его поле и выведем как на сервере, так и у проигравшего игрока.
0
|
25 / 26 / 16
Регистрация: 27.09.2015
Сообщений: 110
|
|
13.10.2016, 18:48 [ТС] | 4 |
Далле, если мы также дебажим, но чуть задержимся и дадим выполниться программе победившего игрока, то мы вообще ничего не получим, у на останется старая метка в буфере. Это в принципе кажется логичным, но не объясняет, почему у победившего игрока в puts() не выводиться сформированное строкой поле.
0
|
25 / 26 / 16
Регистрация: 27.09.2015
Сообщений: 110
|
|
13.10.2016, 18:53 [ТС] | 5 |
Ну и наконец, если все проходит через процесс, когда дебажится игрок, который победит, то все puts() работают, везде все выводиться и все до всего доходит.
Подводя все вышесказанное, я думал, что проблема в том, что победивший игрок заканчивает работу, до того, как сервер получит от него сообщение и данные теряются, но я ставил цикл, и должен был получить и переправить данные проигравшему игроку, проигравший игрок заканчивал работу раньше победившего, но все-равно ничего не выводилось. В любом случае у игрока, который победил, puts() все-равно не выводит строку (а в режиме дебагинага - выводит). И в чем проблема - не понятно.
0
|
25 / 26 / 16
Регистрация: 27.09.2015
Сообщений: 110
|
||||||||||||||||
13.10.2016, 23:37 [ТС] | 6 | |||||||||||||||
Так, после пяти часов разбирательств вот что выяснилось.
0
|
shvyrevvg
|
14.10.2016, 08:11
#7
|
0
|
153 / 148 / 66
Регистрация: 20.02.2014
Сообщений: 556
|
|
14.10.2016, 10:50 | 8 |
Pavel Kisliuk, честно говоря, не сильно вдавался в проблему, но похоже на то, что у тебя получается лок на каком-то из сокетов на сервере. То есть в текущий момент сервер общается с игроком №1 и ждет, например, от него recv(), а в это время ему делает send() игрок №2 и сам потом от него ждет recv(). Так как сокеты у тебя блокирующие, то они и весят в своего рода дедлоке. Попробуй на сервер либо юзать select(), либо неблокирующие сокеты FIONBIO. А в дебаг режиме работает, скорее всего потому, что успевает выполнить правильный порядок send()/recv() между сервером и игроками.
1
|
25 / 26 / 16
Регистрация: 27.09.2015
Сообщений: 110
|
|||||||||||
14.10.2016, 12:36 [ТС] | 9 | ||||||||||
shvyrevvg, ну, как ни странно, но у меня в коде buffer_For_RECV объявляется так:
Но, на самом деле я просто сделал так, вообще не задумываясь, как лучше, единственное, что подумал, что мне нужен размер строки, а не размер самого массива. Добавлено через 18 минут Вованя, блин, вообще уже ничего не понимаю =) Вставил цикл перед отработкой send, чтобы сделать задержку небольшую, и все работает нормально!
0
|
1786 / 1036 / 445
Регистрация: 12.05.2016
Сообщений: 2,550
|
|
14.10.2016, 12:41 | 10 |
Pavel Kisliuk, можете весь код выложить? Попробуйте задержки ставить после вывода на сервере в if и else, посмотреть что будет
0
|
14.10.2016, 12:41 | |
14.10.2016, 12:41 | |
Помогаю со студенческими работами здесь
10
SOCKET: send(), recv() send, recv и close Delphi и Winapi: Send и Recv recv() и send() странное поведение Искать еще темы с ответами Или воспользуйтесь поиском по форуму: |