На главную Наши проекты:
Журнал   ·   Discuz!ML   ·   Wiki   ·   DRKB   ·   Помощь проекту
ПРАВИЛА FAQ Помощь Участники Календарь Избранное RSS
msm.ru
Страницы: (2) [1] 2  все  ( Перейти к последнему сообщению )  
    > Сокеты! , я думаю я не первый
      сокет работает только в начале
      потом ресив ничего не принимает
      хотя первая передача успешна
      уверне что нехватает толи сбраса или ещё чегото
        Наверное все таки исходника.
          всё начал понимать повторный вызов рецив (после удачного) возвращает 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 -
                                  0 пользователей читают эту тему (0 гостей и 0 скрытых пользователей)
                                  0 пользователей:


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