URL: https://www.opennet.me/cgi-bin/openforum/vsluhboard.cgi
Форум: vsluhforumID9
Нить номер: 7419
[ Назад ]

Исходное сообщение
"send() отправка большого пакета"

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

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

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


Содержание

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

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


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

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


"send() отправка большого пакета"
Отправлено nony , 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));  


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

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


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

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

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