Модераторы: gambit
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Отправка данных через сокет в блокирующем режиме, ...почему-то происходит мгновенно 
:(
    Опции темы
vers
Дата 3.5.2007, 11:36 (ссылка)  | (голосов:1) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 3
Регистрация: 3.5.2007

Репутация: нет
Всего: нет



C#, .NET 2.0
Имеется сокет, socket.Blocking = true, однако, при отправке сколько угодно большого количества данных операция отправки завершается моментально, не дожидаясь приема всех данных сервером, хотя MSDN пишет: "If you are in blocking mode, and you make a method call which does not complete immediately, your application will block execution until the requested operation completes."
Код
Socket socket = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
IPEndPoint ep = new IPEndPoint(IPAddress.Parse("192.168.0.1"), 1999);
socket.Blocking = true;
socket.Connect(ep);
byte[] buf = new byte[100000000];
int bytesSent = bytesSent = socket.Send(buf);
MessageBox.Show(bytesSent.ToString());


IP-адрес 192.168.0.1 — не локальный.
С приемом данных то же самое, приходиться крутить socket.Receive в цикле, пока она не примет все данные.
PM MAIL   Вверх
Alarmod
Дата 17.6.2008, 09:52 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 2
Регистрация: 17.6.2008

Репутация: нет
Всего: нет



Та же проблема smile Ничего не помогает кроме как поставить Thread.Sleep перед получением. Иначе обрывается передаваемый текст наполовине. Свяжитесь пожалуйста, нельзя же так оставлять.
PM MAIL   Вверх
vers
Дата 19.6.2008, 02:28 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 3
Регистрация: 3.5.2007

Репутация: нет
Всего: нет



С получением данных ничего страшного: в начале сообщения отправляем размер передаваемого сообщения, а потом крутим Receive в цикле, пока все сообщение не будет принято целиком.
Вот пример:
Код

byte[] l = new byte[2];
int bytesread = socket.Receive(l, 2, SocketFlags.None);
if (bytesread > 0)
{
    if (bytesread < 2)
        socket.Receive(l, 1, 1, SocketFlags.None);
    int len = l[0] * 256 + l[1];
    bytesread = 0;
    byte[] buf = new byte[len];
    while (bytesread < len)
        bytesread += socket.Receive(buf, bytesread, len - bytesread, SocketFlags.None);
}

А насчет отправки мне посоветовали вот это:
Цитата
При создании сокета установить
Socket.SendBufferSize = 65536;
При передаче разбить файл на куски по 16384 байт и передачу следующей порции начинать только если
true == Socket.Poll(-1, SelectMode.SelectWrite)

PM MAIL   Вверх
PashaPash
Дата 20.6.2008, 11:39 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1233
Регистрация: 3.1.2008

Репутация: 6
Всего: 49



vers, надеятся что клиент всегда пришлет правильный размер и первых двух байтах - не совсем надежно. Проще использовать MemoryStream и буффер фиксированного размера.


--------------------
PM MAIL WWW   Вверх
Alarmod
Дата 21.6.2008, 00:18 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 2
Регистрация: 17.6.2008

Репутация: нет
Всего: нет



Сделал аналогично smile

Код

byte[] dir = new byte[size];
rec_info = 0;
while (rec_info != size)
     rec_info += sClient.Receive(dir, rec_info, size - rec_info, SocketFlags.None);


Код

rec_info = 0;

while (rec_info != DirBlock.Length)
     rec_info += sClient.Send(DirBlock, rec_info, DirBlock.Length - rec_info, SocketFlags.None);


Это сообщение отредактировал(а) Alarmod - 21.6.2008, 00:19
PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Прежде чем создать тему, посмотрите сюда:
cully
mr.DUDA
Exception

Используйте теги [code=csharp][/code] для подсветки кода. Используйтe чекбокс "транслит" если у Вас нет русских шрифтов.

Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, cully, mr.DUDA, Exception.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Распределённые приложения и сеть | Следующая тема »


 




[ Время генерации скрипта: 0.0495 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.