The OpenNET Project / Index page

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




Версия для распечатки Пред. тема | След. тема
Новые ответы [ Отслеживать ]
send() отправка большого пакета, !*! nony, 13-Июн-08, 16:25  [смотреть все]
Сталкнулся с проблемой... Хочу на клиент отправить пакет длиннойю в мегабайт... делаю send(сокет, пакет,1000000,0) и уходит на клиент толко 35кб...

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

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

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

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

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

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

      • send() отправка большого пакета, !*! nony, 22:20 , 13-Июн-08 (4)
        >>>Сталкнулся с проблемой...
        >>
        >>Клиент не читает данные?
        >
        >Клиент читает эти 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, 21:42 , 13-Июн-08 (3)
      >>Сталкнулся с проблемой...
      >
      >Клиент не читает данные?

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

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

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

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




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

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