На главную Наши проекты:
Журнал   ·   Discuz!ML   ·   Wiki   ·   DRKB   ·   Помощь проекту
ПРАВИЛА FAQ Помощь Участники Календарь Избранное RSS
msm.ru
  
    > Сокеты! , я думаю я не первый
      сокет работает только в начале
      потом ресив ничего не принимает
      хотя первая передача успешна
      уверне что нехватает толи сбраса или ещё чегото
        Наверное все таки исходника.
          всё начал понимать повторный вызов рецив (после удачного) возвращает WSAENOTCONN (10057)
          "
          Socket is not connected.
          A request to send or receive data was disallowed because the socket is not connected and (when sending on a datagram socket using sendto) no address was supplied. Any other type of operation might also return this error - for example, setsockopt setting SO_KEEPALIVE if the connection has been reset.
          "
          я понял что нада сделать КИП ЭЛАЙВ хорошо
          а если без этого как сделать реконект?
            ты написал какуюто муть. "КИП ЭЛАЙВ" тут не причем.
            1. какой сокет создаеш (протокол)
            2. конектишся или нет?
            3. как посылаеш данные
            4. как принимаеш
            5. откуда уверенность что сервер не обрывает коннект так как ты ему не нравишся?
            6. код покажи
              1. стрим
              2. да успешно и более того (пишу простенькую прогу передачи файла) передаю и ПОЛУЧАЮ размер файла в байтах но больше ничего
              3. сенд
              4. рецив
              5. дебагом видел что размер он получает плюс создаются пустые файлы нучжного размера
              6. код ы
              приём
              ExpandedWrap disabled
                void CFtransDlg::OnButton1()
                {
                 
                    WORD wVersionRequested;
                WSADATA wsaData;
                int err;
                 
                wVersionRequested = MAKEWORD( 2, 0 );
                 
                err = WSAStartup( wVersionRequested, &wsaData );
                if ( err != 0 ) {
                    /* Tell the user that we could not find a usable */
                    /* WinSock DLL.                                  */
                    return;
                }
                ////////////////////////////////////////////////////////////////////////////////////////////////
                UpdateData(1);
                  #define SRV_PORT 1234  
                  #define BUF_SIZE 1000  
                  #define TXT_QUEST "Who are you?\n"  
                 
                    int s, s_new;
                    int from_len;
                    
                //  char buf [64];
                    
                    struct sockaddr_in sin, from_sin;  
                 
                    s = socket (AF_INET, SOCK_STREAM, 0);
                 
                    memset ((char *)&sin, '\0', sizeof(sin));
                    sin.sin_family = AF_INET;
                    sin.sin_addr.s_addr = INADDR_ANY;
                 int PortNum;
                PortNum = atoi(m_hp.operator LPCTSTR());
                    sin.sin_port = htons(PortNum);
                 
                    bind (s, (struct sockaddr *)&sin, sizeof(sin));
                 err=   listen (s,SOMAXCONN);
                  
                     from_len = sizeof(from_sin);
                      s_new = accept (s, ( struct sockaddr *)&from_sin, &from_len);
                 
                      char b[20]={0};
                 
                recv(s_new,b,20,0);//////////////////////////////////////////////////////////////
                 
                long bytes;
                long len;
                 
                //bytes=atoi(b);
                sscanf(b,"%d",&bytes);
                 
                //send(s_new,"OK",3,0);//////////////////////////////////////////////////////////////////
                len=bytes;
                //len=50;/////////////////////////////////////////////////
                FILE *file;
                file=fopen(m_file.operator LPCTSTR(),"w+");
                 
                 
                char buf[1500]={0};
                ////////////////// до этого момента всё класс!/////////////////////////////////
                 
                  while (len>=BUF_SIZE)
                {
                    err=  recv(s,buf,BUF_SIZE,0);
                fwrite(buf,sizeof(char),BUF_SIZE,file);
                //send(s_new,"OK\0",3,0);
                 
                len=len-BUF_SIZE;
                }
                err=      recv(s,buf,len,0);
                err=WSAGetLastError ();
                ::AfxMessageBox(buf,0,0);
                fwrite(buf,sizeof(char),len,file);
                //send(s_new,"OK\0",3,0);
                      shutdown (s_new, 0);
                 
                    closesocket(s_new);
                 WSACleanup ();
                    fclose(file);
                }

              отсыл
              ExpandedWrap disabled
                void CFtransDlg::OnButton2()
                {   #define BUF_SIZE 1000
                    UpdateData(1);
                WORD wVersionRequested;
                WSADATA wsaData;
                int err;
                 
                wVersionRequested = MAKEWORD( 2, 0 );
                 
                err = WSAStartup( wVersionRequested, &wsaData );
                if ( err != 0 ) {
                    /* Tell the user that we could not find a usable */
                    /* WinSock DLL.                                  */
                    return;
                }
                 
                //::AfxMessageBox("STOP03",0,0);
                SOCKET s = socket(AF_INET, SOCK_STREAM, 0);
                 //hostent* hp;
                struct hostent*  hp;
                  char b[20]={0};
                  char *pdest;
                   pdest = strchr( m_hp.operator LPCTSTR(), ':' );
                   *pdest=0;
                   pdest++;
                   int i=0;
                   while(*pdest!=0)
                   {       b[i]=*pdest;
                i++;
                pdest++;
                   }
                 
                 
                //::AfxMessageBox("STOP02",0,0);
                  if( (hp=gethostbyname(m_hp.operator LPCTSTR())) == NULL  )
                  {
                     return ;
                  }
                struct sockaddr_in ssin;
                memset ((char *)&ssin, '\0', sizeof(ssin));
                 // memcpy(hp->h_addr_list, &ssin.sin_addr, hp->h_length);
                 // ssin.sin_addr.s_addr=*(unsigned long*)(hp->h_addr);
                 
                ssin.sin_addr.S_un.S_addr = inet_addr(m_hp.operator LPCTSTR());
                 
                  ssin.sin_family = hp->h_addrtype;
                  int PortNum;
                PortNum = atoi(b);
                 
                ssin.sin_port = htons(PortNum);
                 
                 
                //::AfxMessageBox("STOP01",0,0);
                 if(connect(s, (struct sockaddr *)&ssin, sizeof(ssin))==-1){
                 
                     return ;
                  }
                 CFile file;
                 file.Open(m_file.operator LPCTSTR(),CFile::modeRead,NULL);
                 
                 //long len;
                 long len= file.GetLength();
                 
                sprintf(b,"%d",len);
                //sprintf(b,"%d",len);
                  char buf[1500];
                  bool opt;
                  opt=true;
                 err= setsockopt(s,SOL_SOCKET,SO_KEEPALIVE,(const char *)&opt,sizeof(int));
                 err=send(s,b,strlen(b),0);////////////////////////////////////////////////////
                err= setsockopt(s,SOL_SOCKET,SO_KEEPALIVE,(const char *)&opt,sizeof(int));
                 //recv(s,buf,3,0);//////////////////////////////////////////////////////////
                 
                 
                 
                ////////////////// до этого момента всё класс!/////////////////////////////////
                while (len>=BUF_SIZE)
                {
                file.Read(buf,BUF_SIZE);
                err=send(s,buf,BUF_SIZE,0);
                 //recv(s,buf,4,0);
                len=len-BUF_SIZE;
                }
                file.Read(buf,len);
                ::AfxMessageBox(buf,0,0);
                err=send(s,buf,len,0);
                err=WSAGetLastError ();
                // recv(s,buf,4,0);
                //Sleep(9000);
                ::AfxMessageBox("STOP00",0,0);
                 
                      shutdown (s, 0);
                    closesocket(s);
                     WSACleanup ();
                        file.Close();
                }
              Сообщение отредактировано: DINETS -
                void CFtransDlg::OnButton1() - запускается TCP-сервер
                void CFtransDlg::OnButton2() - запускается TCP-клиент
                Они в одном программном модуле? т.е. разными кнопками программа выходит или в режим клиента, или сервера.
                Тут можно поподробнее?
                  да прога и клиент и сервер естественно для отладки надо 2 запущеных приложения

                  в мсходниках я написал пометки где у меня до какого момента всё класс и ошибок нет никаких
                  ExpandedWrap disabled
                    ////////////////// до этого момента всё класс!/////////////////////////////////
                  Сообщение отредактировано: DINETS -
                    Скорее всего вы рановато закрываете серверный присоединенный сокет
                      Цитата Oleg2004 @
                      Скорее всего вы рановато закрываете серверный присоединенный сокет

                      ГДЕ??? в том то и дело где я его закрываю?!?!?
                        err= setsockopt(s,SOL_SOCKET,SO_KEEPALIVE,(const char *)&opt,sizeof(int));
                        Если вы думаете, что эта опция поддерживает соединение живым (открытым) - так это не так.
                        Ее кстати надо совместно с TCP_KEEPALIVE использовать...
                        Да, уберите из кода все лишнее закоменченное - никак не позволяет сосредоточиться.
                        И укажите точно, где и кто затыкается - неясно. Инструкция ---- и ошибка.
                          TCP_KEEPALIVE ??? а де это? может setsockopt(s,IPPROTO_TCP1,SO_KEEPALIVE,(const char *)&opt,sizeof(int));
                          ибо TCP_KEEPALIVE нет, а для уровня IPPROTO_TCP1 есть только тотже SO_KEEPALIVE


                          ну какие будут идеи ????????
                          а совсем забыл студия 6 у меня
                            IPPROTO_TCP
                            Константа для указания уровня TCP.
                            TCP_KEEPALIVE
                            Устанавливает интервал времени между пакетами "keep alive" в секундах. Вначале следует активировать опцию SO_KEEPALIVE.

                            Как я уже отметил, для вас это не является необходимым.
                              Цитата DINETS @
                              сокет работает только в начале ...

                              а с чего вы взяли что принимаете весь буффер передачи?

                              ExpandedWrap disabled
                                while (len>=BUF_SIZE)
                                {
                                  err = recv(s, buf, BUF_SIZE, 0);
                                  fwrite(buf, sizeof(char), BUF_SIZE, file);
                                //send(s_new,"OK\0",3,0);
                                  len = len - BUF_SIZE;
                                }


                              Типа сами так хотите?
                              Вы должны проверять на кол-во принятых байт и именно это значение минусовать от общей длины. TCP Вам НЕ гарантирует приход ПАКЕТОВ(читай квантов передачи!!!) он гарантирует ПОТОК. А это РАЗНЫЕ вещи!!!

                              удачи Вам
                              (круглый)
                              ЗЫ
                              Самая распространённая ошибка при TCP юзанье..
                                Цитата kolobok0 @
                                Цитата DINETS @
                                сокет работает только в начале ...

                                а с чего вы взяли что принимаете весь буффер передачи?

                                ExpandedWrap disabled
                                  while (len>=BUF_SIZE)
                                  {
                                    err = recv(s, buf, BUF_SIZE, 0);
                                    fwrite(buf, sizeof(char), BUF_SIZE, file);
                                  //send(s_new,"OK\0",3,0);
                                    len = len - BUF_SIZE;
                                  }


                                Типа сами так хотите?
                                Вы должны проверять на кол-во принятых байт и именно это значение минусовать от общей длины. TCP Вам НЕ гарантирует приход ПАКЕТОВ(читай квантов передачи!!!) он гарантирует ПОТОК. А это РАЗНЫЕ вещи!!!

                                удачи Вам
                                (круглый)
                                ЗЫ
                                Самая распространённая ошибка при TCP юзанье..

                                вобще замечание оффтоп так как НИЧЕГО неприходит! да я знаю что в пакеты оно группируется но тут это вобще не к месту оно рвётся чегото!!!!
                                лучшеб чтото более нужное посоветывали
                                  проверку на send/recv не забудь ;)
                                  наподобие send сделай(R_ERROR = -1, R_OK = 0)
                                  ExpandedWrap disabled
                                    int MDRVSSend(const SOCKET sock, const char *send_msg, const WORD send_size)
                                    {
                                        if(!send_msg || send_size < 0) return R_ERROR;
                                        int sended = 0, total_sended = 0, counter = 0;
                                        while(sended < send_size)
                                        {
                                            sended = send(sock, send_msg + total_sended, send_size - total_sended, 0);
                                            if(sended == SOCKET_ERROR)
                                                if(WSAGetLastError() == WSAEWOULDBLOCK)
                                                {
                                                    if(counter > 10) return R_ERROR;
                                                    counter++;
                                                    continue;
                                                }
                                                else break;
                                                total_sended += sended;
                                        }
                                        return total_sended == send_size ? R_OK : R_ERROR;
                                    }
                                  Сообщение отредактировано: popsa -
                                    Цитата DINETS @
                                    ...вобще замечание оффтоп так как НИЧЕГО неприходит! да я знаю что в пакеты оно группируется но тут это вобще не к месту оно рвётся чегото!!!!...

                                    1) что значит оффтоп? т.е. до этого куска кода не доходит? почему тогда вводите в заблуждение надписью что работает до сих пор? Просто так поприкалываться захотелось?
                                    2) в пакеты ПРИ ЮЗАНЬЕ TCP слоя как раз НЕ формируются. потому как НЕТ ПОНЯТИЯ ПАКЕТЫ...есть понятие ПОТОК..почуствуйте разницу...
                                    3) Приведённый код НЕ РАБОЧИЙ...
                                    4) Расшифруйте термин "рвёться". где, что рвёться. помню у одного человека тут не рвалось пол года...но то другая история...

                                    происходит эксепшен...
                                    с чего вы взяли что рвёться? нет такого понятия в МСДНе...
                                    есть при вызове функции(метода) такого то, возврат такой...должно быть(ожидаю) такой...
                                    сделал то-то и то-то...включил анализатор...приходят(не приходят) пакеты такие то...

                                    а то какое то гадание на кофейне...

                                    удачи Вам
                                    (круглый)
                                    ЗЫ
                                    Заметьте время теряется из за недопонимания...
                                    ЗЫ ЗЫ
                                    детский сад...
                                      Цитата DINETS @
                                      всё начал понимать повторный вызов рецив (после удачного) возвращает WSAENOTCONN (10057)
                                      "
                                      Socket is not connected.
                                      A request to send or receive data was disallowed because the socket is not connected and (when sending on a datagram socket using sendto) no address was supplied. Any other type of operation might also return this error - for example, setsockopt setting SO_KEEPALIVE if the connection has been reset.
                                      "
                                      я понял что нада сделать КИП ЭЛАЙВ хорошо
                                      а если без этого как сделать реконект?

                                      я чо на инопланетном говорю или тут у когото мозг в черепе не вмещается???!


                                      ExpandedWrap disabled
                                        err=      recv(s,buf,len,0);
                                        err=WSAGetLastError ();

                                      при приёме не входя в цикл (при маленьком файле хотя в цикле тоже)

                                      вот тут ошибка!
                                      и всё больше негде и КОД РАБОЧИЙ!
                                      Сообщение отредактировано: DINETS -
                                        вот
                                        Прикреплённый файлПрикреплённый файлftrans.rar (31.47 Кбайт, скачиваний: 176)
                                          Давайте только не будем горячиться.....
                                          Ваши объяснения порой действительно трудно понять
                                          Итак
                                          Вы выполняете:
                                          err= recv(s,buf,len,0);
                                          и recv() вылетает с ошибкой, что фиксирует:
                                          err=WSAGetLastError ();
                                          те err=10057
                                          Так что ли?
                                          Кстати, так сетевые программы не рекомендуется писать, надо примерно так:
                                          ExpandedWrap disabled
                                            // connect to server
                                            if ( connect( sock, (sockaddr*) &addr, sizeof( sockaddr ) ) == SOCKET_ERROR )
                                                {
                                                    int error = WSAGetLastError( );
                                                    if ( ( error != WSAEWOULDBLOCK ) && ( error != WSAEINPROGRESS ) )
                                                    {
                                                    fprintf( stderr, "Failed connecting to remote host, %d\n", error );
                                                    closesocket(sock);
                                                    exit( 1 );
                                                    }
                                                }

                                          или так
                                          ExpandedWrap disabled
                                             if ((numbytes = recv(sock, buff, MAXDATASIZE, 0)) == SOCKET_ERROR)
                                                  cout << "recv fail with code " << WSAGetLastError() << endl;

                                          И еще
                                          ошибочный recv() этот выполняется в серверном варианте или клиентском?
                                          Я же вас просил - уберите все коменты (трудно отслеживать ваш код, вы же просите помочь, а сами навстречу не идете)и точно укажите тот recv() - их ведь у вас куча - после которого вылетает ошибка.

                                          Добавлено
                                          Нда......
                                          Посмотрел на ваш проект......... <_<
                                            Цитата
                                            ошибочный recv() этот выполняется в серверном варианте или клиентском?

                                            да в серверной части ОН Батон 1 яж писал выше

                                            Добавлено
                                            ну а сам проэкт работает? а то тут некоторые....
                                              Значит, соединение с сервером установлено было
                                              и accept() прошел
                                              А recv() вы делаете на акцептированном сокете?
                                              те на сокете, который вернула функция аксепт?
                                                ЧОРТ я идиот
                                                !!!
                                                спасибо я ся долбить ща обстену буду блин
                                                :wall: :wall: :wall: :wall: :wall:


                                                да помнится Энштейн сказал что есть две бесконечности это вселенная и человечкая глупость.
                                                и добавил что в первой он не уверен...

                                                Добавлено
                                                ..
                                                  Цитата DINETS @
                                                  ну а сам проэкт работает? а то тут некоторые....

                                                  попробуйте прогнать несколько сот метров с одного компа на другой. при этом ещё запустите копирование на передатчике или приёмнике с локального диска на локальный диск...
                                                  полученный файл проверьте...лучше какой нить архив прогоните и запустите верифай...

                                                  после того как признаете свою горячность - объясню в чём дело более подробно...

                                                  удачи Вам
                                                  (круглый)
                                                  ЗЫ
                                                  извинения принимаются...все мы такие...
                                                  0 пользователей читают эту тему (0 гостей и 0 скрытых пользователей)
                                                  0 пользователей:


                                                  Рейтинг@Mail.ru
                                                  [ Script execution time: 0,0607 ]   [ 16 queries used ]   [ Generated: 10.12.24, 12:26 GMT ]