На главную Наши проекты:
Журнал   ·   Discuz!ML   ·   Wiki   ·   DRKB   ·   Помощь проекту
ПРАВИЛА FAQ Помощь Участники Календарь Избранное RSS
msm.ru
  
    > Вопрос по ioctlsocket, FIONREAD....
      Добрый день sorry за беспокойство, но я столкнулся с проблеммой надеюсь на Вашу помощь.


      Проблема в следующем:

      Вызываю ioctlsocket(hSocket, FIONREAD, &ulParam );
      Ошибки не возвращает. Все проходит нормально я получаю сообщение.
      Hо в ulParam всегда возвращает ноль, хотя я уже послал килобайт 10 в этот сокет.

      Если не сложно покажите рабочий пример, с выводом количества инфы в стеке сокета.

      Спасибо.
        У тебя наверное сокет асинхронный
          А причем тут асинхронность?

          Он не переведен в не блокируемый режим.
            Цитата
            MIA2000, 19.08.04, 14:13
            А причем тут асинхронность?

            При том что эта команда только для синхронных сокетов


            Цитата
            MIA2000, 19.08.04, 14:13
            Он не переведен в не блокируемый режим.

            Правильно - он в нем по умолчанию
              Так, что же мне сделать? Я вроде все правильно делаю.... Если не сложно то подскажите где ошибка...

              Вот кусок кода:

              ------------------------------------------------------------------------
              ExpandedWrap disabled
                WSADATA wsaData;
                WORD wVersionRequested;
                 
                wVersionRequested = MAKEWORD(2,0);
                WSAStartup(wVersionRequested, &wsaData);
                            SOCKET sock,sock_new;
                            sock = socket(AF_INET,SOCK_STREAM,0);
                            if (sock!=INVALID_SOCKET)
                            {
                                SOCKADDR_IN socketaddr, from_sin;
                                socketaddr.sin_family = AF_INET;
                                socketaddr.sin_addr.s_addr = INADDR_ANY;
                                socketaddr.sin_port = PORT_ADDR;
                                int iAddsize=sizeof(socketaddr);
                                
                        bind(sock,(struct sockaddr*)&socketaddr,iAddsize);
                                listen(sock,5);
                                int iAddsize2=sizeof(from_sin);
                                while(1){
                                
                            sock_new=accept(sock,(struct sockaddr*)&from_sin,&iAddsize2);
                                
                                          
                        DWORD mia;
                                  ioctlsocket( sock_new, FIONREAD, &mia) ;
                                  printf("%d",mia);
                             dwLenIn = recv( sock_new, bu , dwLenIn, 0);
                                        
                                  printf("%s",bu);
                        }
              Сообщение отредактировано: Leprecon -
                Цитата
                Gunnar, 19.08.04, 14:48
                При том что эта команда только для синхронных сокетов

                Цитата
                MSDN
                The ioctlsocket function can be used on any socket in any state. It is used to set or retrieve operating parameters associated with the socket, independent of the protocol and communications subsystem


                Добавлено в :
                Цитата
                Gunnar, 19.08.04, 14:48
                Правильно - он в нем по умолчанию


                Цитата
                MSDN
                When a socket is created, it operates in blocking mode by default (nonblocking mode is disabled).

                Тут скорее всего дело не в этом, может там действительно 0? Может данных нет?
                Проверял?
                Сообщение отредактировано: Братец Лис -
                  Цитата
                  Братец Лис, 19.08.04, 17:03
                  Цитата
                  MSDN
                  The ioctlsocket function can be used on any socket in any state. It is used to set or retrieve operating parameters associated with the socket, independent of the protocol and communications subsystem


                  Цитата
                  Братец Лис, 19.08.04, 17:03
                  Цитата
                  MSDN
                  When a socket is created, it operates in blocking mode by default (nonblocking mode is disabled).


                  Угу, только у меня почему то все время наоборот получается... В чем дело? Может я тупой?
                    Почему сразу тупой, я не знаю почему у тебя так получается, но в противном случае MSDN нас нагло обманывает :)
                      ребят данные есть, при передачи выводит, что 0 даных в стеке сокета, и след строчкой выводит передаваемую информацию, оч. прошу дайте рабочий кусок проги, что бы перенес и откомпилировал-Ю запустил и посмотрел в чем траблы, я так думаю, что это ошибка, причем мало заметная, поскольку втрой день перерываю инет, куча программ (к сожалению больших и сидеть разбираться с компилирование и что они там делают неохота), но ВСЕ, что они у себя проделывают со стеком сокета, я также переносил и смотрел у себя в проге, НИЧЕГО....!, все как было так и остаеться 0 данных и все. Поэтому оч. прошу мне помочь, проблемма эта меня просто достала!!!!!!!!!
                      :wall: -> :blink: -> :wall: -> :wacko: -> :wall: -> :(
                        У тебя вызов ioctlsocket идёт сразу за accept? Если так, то возврат 0 набранных на стеке сокета вполне может быть. А recv принимает данные потому, что она синхронная, и спокойненько дожидается твоих данных. Ты просто попробуй сделать цикл ожидания данных:
                        ExpandedWrap disabled
                           
                          ULONG ulInSize = 0;
                          while( !ioctlsocket( sock_new, FIONREAD, &ulInSize) && !ulInSize) Sleep( 10);

                        И посмотри, работает на самом деле или нет.
                          Ни какой реакции....
                          Привожу код клиента и сервера (очю простой, необходимый "ПРОЖИТОЧНЫЙ" минимум) :rolleyes:
                          Проверял по breakpoint на ioctlsocket, размер как был 0 так и остаеться, программа входит в бесконечный цикл и "висит" ожидая данных, а данных нема.....

                          Client
                          ------------------------------
                          ExpandedWrap disabled
                            #include "stdafx.h"
                            #include "winsock.h"
                            #include "iostream.h"
                            #include <stdio.h>
                            #include <io.h>
                            #include <windows.h>
                             
                            #define PORT_ADDR 2000    
                             
                            char lpReturnedString[100];
                            char buffer[3]="aa";
                             
                            char work_socket()    
                            {
                             
                            WSADATA wsaData;
                            const int WINSOCK_VERSION = 0x0101;
                            struct hostent *hp;
                                
                                WSAStartup(WINSOCK_VERSION, &wsaData);
                                        SOCKET sock;
                                        sock = socket(AF_INET,SOCK_STREAM,0);
                                        if (sock!=INVALID_SOCKET)
                                        {
                                            SOCKADDR_IN socketaddr, from_sin;
                                            socketaddr.sin_family = AF_INET;
                                            socketaddr.sin_addr.s_addr = INADDR_ANY;
                                            socketaddr.sin_port = PORT_ADDR;
                                                 int iAddsize=sizeof(socketaddr);
                                            bind(sock,(struct sockaddr*)&socketaddr,iAddsize);
                                            hp=gethostbyname("127.0.0.1");      
                                              from_sin.sin_family=AF_INET;
                                              memcpy((char*)&from_sin.sin_addr,hp->h_addr,hp->h_length);
                                    from_sin.sin_port=PORT_ADDR;
                                    int iAddsize2=sizeof(from_sin);
                                    connect(sock,(struct sockaddr*)&from_sin,iAddsize2);
                                          
                                    send(sock,buffer,sizeof(buffer),0);
                                        }  
                                WSACleanup();
                                return(0);
                                }
                                
                            void main()
                            {
                            work_socket();
                            }



                          Server
                          --------------------------------------------
                          ExpandedWrap disabled
                            #include "stdafx.h"
                            #include "winsock2.h"
                            #include "iostream.h"
                            #include <stdio.h>
                            #include <io.h>
                            #include <windows.h>
                            #include <fcntl.h>
                             
                            #define PORT_ADDR 2000    
                            #define BUF_SIZE 64
                             
                            char lpReturnedString[100];
                            char bu[BUF_SIZE];
                             
                            char work_socket()    
                            {
                             
                            WSADATA wsaData;
                            WORD wVersionRequested;
                             
                            wVersionRequested = MAKEWORD(2,2);
                             
                                
                                WSAStartup(wVersionRequested, &wsaData);
                                        SOCKET sock,sock_new;
                                        sock = socket(AF_INET,SOCK_STREAM,0);
                                        if (sock!=INVALID_SOCKET)
                                        {
                                            SOCKADDR_IN socketaddr, from_sin;
                                            socketaddr.sin_family = AF_INET;
                                            socketaddr.sin_addr.s_addr = INADDR_ANY;
                                            socketaddr.sin_port = PORT_ADDR;
                                                 int iAddsize=sizeof(socketaddr);
                                            
                                    bind(sock,(struct sockaddr*)&socketaddr,iAddsize);
                                            listen(sock,5);
                                    int iAddsize2=sizeof(from_sin);
                                    while(1){
                                            
                                    sock_new=accept(sock,(struct sockaddr*)&from_sin,&iAddsize2);
                                    DWORD dwLenIn;  
                                        
                                        
                                   [B]ULONG ulInSize = 0;
                                        while( !ioctlsocket( sock_new, FIONREAD, &ulInSize) && !ulInSize) Sleep( 10);
                                               printf("%d",&ulInSize);[/B]      
                                               dwLenIn = recv( sock_new, bu , ulInSize+64, 0);
                                               printf("%s",bu);    
                                               printf("%d",dwLenIn);
                                        }
                                }  
                                WSACleanup();
                                return(0);
                                }
                                
                            void main()
                            {
                            work_socket();
                            }
                          Сообщение отредактировано: Leprecon -
                            1)
                            Цитата

                            send(sock,buffer,sizeof(buffer),0);
                            }
                            WSACleanup();

                            Ну дык ты делаешь попытку послать, и сразу прочищаешь сокеты....

                            2)
                            Цитата
                            dwLenIn = recv( sock_new, bu , ulInSize+64, 0);

                            А зачем ты прибавляешь 64??? FIONREAD сообщает тебе, скока можно считывать из сокета, а ты ещё 64 откуда-то хочешь получить....

                            3) И зачем ты кстати биндишь клиента?
                            Сообщение отредактировано: AlexSm -
                              БОЛЬШОЕ ЧЕЛ. СПАСИБО ! Ctrl+Y by Leprecon :D B) :D ;) :lol: !

                              Вот, что значит переделывать старые заготовки под новые задачи, точто, я и не замечад, что чишу сокет, а пребавляю 64, это ерунда, когда давал 0, я с горя 64 прибавил, что бы хоть строчку поймать.
                              P.S. как все повернулось ошибка была не в серврере а в клиенте, мда..... :whistle: еще раз спасибо.
                                M
                                MIA2000, пользуйся тегом кода.
                                [ code][ /code] - без пробелов
                                и не флуди в сообщениях.
                                0 пользователей читают эту тему (0 гостей и 0 скрытых пользователей)
                                0 пользователей:


                                Рейтинг@Mail.ru
                                [ Script execution time: 0,0426 ]   [ 16 queries used ]   [ Generated: 12.12.24, 22:21 GMT ]