The OpenNET Project / Index page

[ новости /+++ | форум | теги | ]

форумы  помощь  поиск  регистрация  майллист  вход/выход  слежка  RSS
"send() отправка большого пакета"
Вариант для распечатки  
Пред. тема | След. тема 
Форумы Программирование под UNIX (Public)
Изначальное сообщение [ Отслеживать ]

"send() отправка большого пакета"  
Сообщение от nony email on 13-Июн-08, 16:25 
Сталкнулся с проблемой... Хочу на клиент отправить пакет длиннойю в мегабайт... делаю send(сокет, пакет,1000000,0) и уходит на клиент толко 35кб...

думал что проблема с переполнением буфера сокета... написал ф-ию которая сегментирует этот пакет на мелкие размером 1024 байта... но  в сумме уходит на клиент опять только 35кб после чего возвращает -1 и все...

В чем может быть проблема подскажите пожалуйста и как мне отправить пакет такой длинны правильно?

Высказать мнение | Ответить | Правка | Cообщить модератору

 Оглавление

Сообщения по теме [Сортировка по времени | RSS]


1. "send() отправка большого пакета"  
Сообщение от Michelnok (??) on 13-Июн-08, 16:35 
>Сталкнулся с проблемой...

Клиент не читает данные?

Высказать мнение | Ответить | Правка | Наверх | Cообщить модератору

2. "send() отправка большого пакета"  
Сообщение от nony email on 13-Июн-08, 16:37 
>>Сталкнулся с проблемой...
>
>Клиент не читает данные?

Клиент читает эти 35кб и больше ничего не получает.

Высказать мнение | Ответить | Правка | Наверх | Cообщить модератору

4. "send() отправка большого пакета"  
Сообщение от nony email on 13-Июн-08, 22:20 
>>>Сталкнулся с проблемой...
>>
>>Клиент не читает данные?
>
>Клиент читает эти 35кб и больше ничего не получает.

Все, спасибо. Проблему решил.
Вот ф-ия, малли кому  понадбится.

int sendall(int sock,char* pbuf,int noc)    
{                      
  int nreste, necrit;  
  nreste = noc;
  while (nreste > 0) {  
refecriture:    
      necrit = write (sock, pbuf, nreste);    
      if ( (necrit < 0) && (errno = EWOULDBLOCK)) {  
         printf("EWOULDBLOCK");      
    
    
         fcntl(sock, F_SETFL, ~FNDELAY&fcntl(sock, F_GETFL,0));  
         goto refecriture;    
      }      
      if (necrit < 0) return(necrit);
      nreste -= necrit;        
      pbuf += necrit;
  }            
  return(noc-nreste);  
}                      


вот собственно дилей выставляется
fcntl(sock, F_SETFL, ~FNDELAY&fcntl(sock, F_GETFL,0));  

Высказать мнение | Ответить | Правка | Наверх | Cообщить модератору

3. "send() отправка большого пакета"  
Сообщение от nony email on 13-Июн-08, 21:42 
>>Сталкнулся с проблемой...
>
>Клиент не читает данные?

Сделал sleep в 0.1 секунды в цикле отправки сегментами, пакет прошел. Тоесть видимо проблема в переполнении буфера сокета... Но это не выход из ситуации делать какие то задежки, как то надо узнавать о состоянии буфера отправился пакет или не отправился.... Как это сделать?

Высказать мнение | Ответить | Правка | Наверх | Cообщить модератору

5. "send() отправка большого пакета"  
Сообщение от Michelnok (??) on 15-Июн-08, 17:18 
>после чего возвращает -1 и все...

А что в errno после того как send вернул -1?

P.S. Задержки вставлять - это действительно несерьезно.

Высказать мнение | Ответить | Правка | Наверх | Cообщить модератору

Архив | Удалить

Индекс форумов | Темы | Пред. тема | След. тема
Оцените тред (1=ужас, 5=супер)? [ 1 | 2 | 3 | 4 | 5 ] [Рекомендовать для помещения в FAQ]




Партнёры:
PostgresPro
Inferno Solutions
Hosting by Hoster.ru
Хостинг:

Закладки на сайте
Проследить за страницей
Created 1996-2025 by Maxim Chirkov
Добавить, Поддержать, Вебмастеру