Гость
Форумы / WinForms, .Net Framework [игнор отключен] [закрыт для гостей] / Почему клиент сокет не принимает данные от сервера? / 17 сообщений из 17, страница 1 из 1
17.11.2015, 14:00
    #39105568
VaneS Ri_lax
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Почему клиент сокет не принимает данные от сервера?
Здравствуйте, пишу сокет клиент на c#.
Принцип работы простой, клиент посылает строку запроса, сервер что то отвечает строкой ответа.
Вот собственно сам клиент:
Код: c#
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
private static void sendDataOEM()
        {
            Socket s = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
            IPAddress ipAddress = null; //IP-адресс
            IPEndPoint Addr = null; //конечная точка(IP и порт)

            ipAddress = Dns.GetHostEntry("web.domen.ru").AddressList[0];
            Addr = new IPEndPoint(ipAddress, 3319);
            s.Connect(Addr);

            byte[] msg = Encoding.UTF8.GetBytes("This is a test");
            int i = s.Send(msg); //Отправляем
            Console.WriteLine("Sent {0} bytes.", i);

            byte[] bytes = new byte[256];
            i = s.Receive(bytes);


            Console.WriteLine(Encoding.UTF8.GetString(bytes));
            s.Close();
        }


Отправляются данные нормально, но вот ответ с сервера не приходит. В чем может быть проблема?
Заранее большое спасибо!
...
Рейтинг: 0 / 0
17.11.2015, 18:59
    #39105929
Arm79
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Почему клиент сокет не принимает данные от сервера?
Просто не успевает получить? Поставьте Sleep(1000) перед получением данных и проверьте
...
Рейтинг: 0 / 0
18.11.2015, 11:11
    #39106325
Артем_84
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Почему клиент сокет не принимает данные от сервера?
Столкнулся с таким же поведением, разрешилось только со Sleep'ом

При этом, если использовался TcpClient, таких проблем не было.
...
Рейтинг: 0 / 0
18.11.2015, 12:53
    #39106507
Изопропил
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Почему клиент сокет не принимает данные от сервера?
Arm79Поставьте Sleep(1000) перед получением данных
бред сивой кобылы
...
Рейтинг: 0 / 0
18.11.2015, 12:55
    #39106510
Arm79
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Почему клиент сокет не принимает данные от сервера?
ИзопропилArm79Поставьте Sleep(1000) перед получением данных
бред сивой кобылы

Почему бред? Написано же, проверить . Мало ли по каким причинам сервер не отвечает )))
Теперь убедились, что сервер работает нормально, просто клиент не знает, что ответ сервера нужно ждать. Нужно смотреть протокол прикладного уровня.
...
Рейтинг: 0 / 0
18.11.2015, 13:53
    #39106603
Изопропил
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Почему клиент сокет не принимает данные от сервера?
Arm79Почему бред? Написано же, проверить
для этого Socket.Select применяется(с таймером или без оного в зависимости от задачи) .
бредом является использование Sleep
...
Рейтинг: 0 / 0
18.11.2015, 14:05
    #39106620
Arm79
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Почему клиент сокет не принимает данные от сервера?
ИзопропилArm79Почему бред? Написано же, проверить
для этого Socket.Select применяется(с таймером или без оного в зависимости от задачи) .
бредом является использование Sleep

Для проверки и слип подойдет. Гораздо быстрее, чем селект с этой точки зрения
...
Рейтинг: 0 / 0
18.11.2015, 14:22
    #39106654
Алексей К
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Почему клиент сокет не принимает данные от сервера?
Arm79Изопропилпропущено...

для этого Socket.Select применяется(с таймером или без оного в зависимости от задачи) .
бредом является использование Sleep

Для проверки и слип подойдет. Гораздо быстрее, чем селект с этой точки зренияНе подойдёт. Подойдёт Read + соответствующий ReadTimeout.
...
Рейтинг: 0 / 0
18.11.2015, 15:31
    #39106814
Изопропил
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Почему клиент сокет не принимает данные от сервера?
Arm79Для проверки и слип подойдет. Гораздо быстрее, чем селект с этой точки зрения
в каком смысле быстрее?
...
Рейтинг: 0 / 0
18.11.2015, 16:02
    #39106860
Arm79
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Почему клиент сокет не принимает данные от сервера?
ИзопропилArm79Для проверки и слип подойдет. Гораздо быстрее, чем селект с этой точки зрения
в каком смысле быстрее?
В смысле написать и тут же протестить
Чем потратить минут 10-20 чтобы прочитать хелп, применить селект и еще думать, ошибся или нет.

Человек же явно не спец в разработке таких вещей, ему бы попроще что нить
...
Рейтинг: 0 / 0
18.11.2015, 18:35
    #39107102
Изопропил
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Почему клиент сокет не принимает данные от сервера?
Arm79Человек же явно не спец в разработке таких вещейпущай учится
...
Рейтинг: 0 / 0
18.11.2015, 20:05
    #39107175
Dima T
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Почему клиент сокет не принимает данные от сервера?
"Лучше день потерять, потом за час долететь" (с)
Sleep() надо вообще запретить. Ни разу не сталкивался чтобы он был реально нужен. Разве что при отладке.
Зато из-за него было много случаев переписываний кода из состояния "лишь бы работало", в состояние "чтобы работало быстро".
...
Рейтинг: 0 / 0
18.11.2015, 20:40
    #39107194
ЕвгенийВ
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Почему клиент сокет не принимает данные от сервера?
Dima T"Лучше день потерять, потом за час долететь" (с)
Sleep() надо вообще запретить. Ни разу не сталкивался чтобы он был реально нужен. Разве что при отладке.
Зато из-за него было много случаев переписываний кода из состояния "лишь бы работало", в состояние "чтобы работало быстро".
Ну зачем так опрометчиво то? Он например находит свое применение в реализации SpinWait или SpinLock.
...
Рейтинг: 0 / 0
18.11.2015, 23:17
    #39107242
Arm79
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Почему клиент сокет не принимает данные от сервера?
Dima TРазве что при отладке.
Arm79Поставьте Sleep(1000) перед получением данных и проверьте


Dima TНи разу не сталкивался чтобы он был реально нужен
Ранее, до TPL, использовал Sleep(0) или Sleep(1) для переключения потоков или неблокирующего ожидания
...
Рейтинг: 0 / 0
19.11.2015, 07:34
    #39107335
Dima T
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Почему клиент сокет не принимает данные от сервера?
C# только осваиваю, с многопоточностью и асинхронными операциями пока не разбирался, написал по своему опыту работы на Си с WinAPI. Там все асинхронные операции имеют возможность блокирующего ожидания завершения. При необходимости можно задать максимальное время ожидания. Используются WaitForSingleObject() или WaitForMultipleObject() но никак не Sleep()
Если асинхронность не нужна - имеются синхронные аналоги. В данном случае надо именно такой аналог искать.
Думаю в C# должна быть аналогичная ситуация. Оно поверх того же WinAPI работает.

В данном случае вообще непонятно в чем проблема, судя по хэлпу Socket.Receive() блокирующая операция
https://msdn.microsoft.com/ru-ru/library/ms145154(v=vs.110).aspx Если отсутствуют данные, доступные для чтения, метод Receive будет выполнять блокирование до тех пор, пока не станут доступны данные, если не было установлено значение тайм-аута путем использования объекта Socket.ReceiveTimeout.Если значение тайм-аута было превышено, объект Receive выдаст исключение SocketException.Если используется неблокирующий режим и отсутствуют данные в стековом буфере протокола, метод Receive немедленно завершится и создаст исключение SocketException.Чтобы определить наличие данных, доступных для чтения, можно использовать свойство Available.Когда значение свойства Available не равно нулю, повторите операцию приема.
Скорее всего сервер просто закрывает соединение ничего не отвечая.
...
Рейтинг: 0 / 0
19.11.2015, 07:57
    #39107343
Алексей К
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Почему клиент сокет не принимает данные от сервера?
Dima TВ данном случае вообще непонятно в чем проблема.Было же выше посоветовано - увеличить ReadTimeout, извращенцы вместо этого могут использовать Sleep.
...
Рейтинг: 0 / 0
21.11.2015, 20:38
    #39109823
Dima T
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Почему клиент сокет не принимает данные от сервера?
ЕвгенийВDima T"Лучше день потерять, потом за час долететь" (с)
Sleep() надо вообще запретить. Ни разу не сталкивался чтобы он был реально нужен. Разве что при отладке.
Зато из-за него было много случаев переписываний кода из состояния "лишь бы работало", в состояние "чтобы работало быстро".
Ну зачем так опрометчиво то? Он например находит свое применение в реализации SpinWait или SpinLock.
Дочитал до этого места у Рихтера, могу прокомментировать. Sleep() тут используется не по прямому назначению:
Sleep(0) - отдать оставшийся квант времени другому потоку с таким же приоритетом
Sleep(1) - разрешить выполниться потоку с более низким приоритетом

Просто нет функций WinAPI которые это сделают, поэтому используют Sleep(). Но это не говорит о том что Sleep() полезен всюду. Пусть он будет во внутренностях каких-то объектов (которые понимают эти тонкости), но в своем коде его не надо вызывать никогда.
...
Рейтинг: 0 / 0
Форумы / WinForms, .Net Framework [игнор отключен] [закрыт для гостей] / Почему клиент сокет не принимает данные от сервера? / 17 сообщений из 17, страница 1 из 1
Целевая тема:
Создать новую тему:
Автор:
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]