На главную Наши проекты:
Журнал   ·   Discuz!ML   ·   Wiki   ·   DRKB   ·   Помощь проекту
ПРАВИЛА FAQ Помощь Участники Календарь Избранное RSS
msm.ru
Страницы: (3) 1 2 [3]  все  ( Перейти к последнему сообщению )  
    > nonblocking sockets C (си) , connect () failed: no error
      У Вас больше проблема с путями к заголовочным файлам. Потому и не компилится. А пример чистый С.
      Сообщение отредактировано: dikdik -
        Да особой разницы то я и не вижу - с и спп :D

        Добавлено
        Цитата dikdik @
        А пример чистый С.

        Это точно.....поэтому я и не видел разницы :D
        Чистый С в Студии компилится как спп без проблем.....во всяком случае у меня.
        А по ошибкам - да, видимо нет доступа к описанию элементарных типов......
          стартует, открывает соединение, ждет tv и выдает <cenzored>точек
          всё. поправил, теперь всё работает
          ExpandedWrap disabled
            #include <stdio.h>      /* for printf(), fprintf() */
            #include <winsock2.h>    /* for socket(),... */
            #include <stdlib.h>     /* for exit() */
            #include <time.h>
            #include <sys/types.h>
            #define MAXDATASIZE 1000
            #define RCVBUFSIZE 3200   /* Size of receive buffer */
             
            void DieWithError(char *errorMessage){
                perror(errorMessage);
                exit(0);
            };  /* Error handling function */
             
            void main(int argc, char *argv[])
            {
                int sock, rc;                        /* Socket descriptor */
                struct sockaddr_in echoServAddr; /* Echo server address */
                unsigned short echoServPort;     /* Echo server port */
                //char *servIP;                    /* Server IP address (dotted quad) */
                char servIP[] = "10.0.2.2";
                char echoString[]= "identifier=1z2y3z \r\n\r\n";
                char echoBuffer[RCVBUFSIZE];     /* Buffer for echo string */
                int echoStringLen;               /* Length of string to echo */
                int bytesRcvd, totalBytesRcvd;   /* Bytes read in single recv() and total bytes read */
                WSADATA wsaData;                 /* Structure for WinSock setup communication */
                unsigned long nonblocking = 1;
                fd_set writefds, readfds, error_set;
                struct timeval tv;
                tv.tv_sec = 5;
                tv.tv_usec = 500000;
                //servIP =  argv[1];             /* First arg: server IP address (dotted quad) */
                echoServPort = 8088; //atoi(8088);  //atoi(argv[2]);  /* Use given port, if any */
             
                if (WSAStartup(MAKEWORD(2, 0), &wsaData) != 0) /* Load Winsock 2.0 DLL */
                {
                    fprintf(stderr, "WSAStartup() failed");
                    exit(1);
                }
             
                /* Create a reliable, stream socket using TCP */
                if ((sock = socket(PF_INET, SOCK_STREAM, IPPROTO_TCP) ) < 0)
                    DieWithError("socket() failed");
              
             
                /* Set the socket to nonblocking */
                if (ioctlsocket(sock, FIONBIO, &nonblocking) != 0)
                    DieWithError("ioctlsocket() failed");
             
                /* Construct the server address structure */
                memset(&echoServAddr, 0, sizeof(echoServAddr));     /* Zero out structure */
                echoServAddr.sin_family      = AF_INET;             /* Internet address family */
                echoServAddr.sin_addr.s_addr = inet_addr(servIP);   /* Server IP address */
                echoServAddr.sin_port        = htons(echoServPort); /* Server port */
             
                connect(sock, (struct sockaddr *) &echoServAddr, sizeof(echoServAddr));
             
                FD_ZERO(&writefds);
                FD_SET(sock, &writefds);
                rc = select(sock, NULL, &writefds, NULL, &tv);
             
                if((rc == 1) && (FD_ISSET(sock, &writefds))) {
                    printf("connect success\n");
                } else {
                    printf("connect error\n");
                return;
                }
             
                send(sock, "identifier=1z2y3z \r\n\r\n", 26, 0);// шлем id
             
                
                for ( ; ; )
                {
                   FD_ZERO(&readfds);
                FD_ZERO(&error_set);
                FD_SET(sock, &readfds);
                FD_SET(sock, &error_set);
                    //
                    if ( select( sock, &readfds, NULL, &error_set, &tv ) == 1 )
                    {  
                        // check for error
                        if ( FD_ISSET( sock, &error_set ) )
                        {
                            int error, error_len = sizeof( error );
                            getsockopt( sock, SOL_SOCKET, SO_ERROR, (char*) &error, &error_len );
                            fprintf( stderr, "\nError on socket (error: %d)\n", error );
                        }
             
                        // check for message
                        if ( FD_ISSET( sock, &readfds ) )
                        {
                            // receive some data from server
                            if ( ( bytesRcvd = recv( sock, echoBuffer, MAXDATASIZE, 0 ) ) == SOCKET_ERROR )
                            {
                                fprintf( stderr, "Failed receiving data\n" );
                            }
                            else
                            {
                                echoBuffer[bytesRcvd] = '\0';
                                // display the message
                                printf( "\nYep! I got a message: %s\n", echoBuffer );
                            }
                        }
             
                        break;
                    }
                    printf( "." );
                }
              
                WSACleanup();  // Cleanup Winsock
            }

          user posted image
          Добавлено
          Цитата Oleg2004 @
          Да особой разницы то я и не вижу - с и спп :D

          Добавлено
          Цитата dikdik @
          А пример чистый С.

          Это точно.....поэтому я и не видел разницы :D
          Чистый С в Студии компилится как спп без проблем.....во всяком случае у меня.
          А по ошибкам - да, видимо нет доступа к описанию элементарных типов......

          Добавлено
          Цитата dikdik @
          У Вас больше проблема с путями к заголовочным файлам. Потому и не компилится. А пример чистый С.

          так я тоже думал что оно Си'шное. *.c не компилится, а с *.cpp компилится. Всё таки проблема с путями/доступом_к_описанию_элементарных_типов или то написано на C++?
          Сообщение отредактировано: sign63 -
            странно. У меня собирается как под расширением си, так и под расширением сипипи. Как под борландом, так и под майкрософтом.
            И приведенный код работает. Как это не странно. Я опять коннекчусь на яндекс, отправляю эту дребездень которая идентифаер стринг, и получаю 400й код.
            Из неправильного - перед каждым селектом надо делать FD_SET. Нужно обнулять массивы директивой FD_ZERO либо в конце основного цикла, либо в начале..
            короче, всю эту требуху
            Цитата
            FD_ZERO(&readfds);
            FD_ZERO(&error_set);
            FD_SET(sock, &readfds);
            FD_SET(sock, &error_set);

            нужно в основной цикл, сразу за фореву
              Цитата nemez @
              странно. У меня собирается как под расширением си, так и под расширением сипипи. Как под борландом, так и под майкрософтом.
              И приведенный код работает. Как это не странно. Я опять коннекчусь на яндекс, отправляю эту дребездень которая идентифаер стринг, и получаю 400й код.
              Из неправильного - перед каждым селектом надо делать FD_SET. Нужно обнулять массивы директивой FD_ZERO либо в конце основного цикла, либо в начале..
              короче, всю эту требуху
              Цитата
              FD_ZERO(&readfds);
              FD_ZERO(&error_set);
              FD_SET(sock, &readfds);
              FD_SET(sock, &error_set);

              нужно в основной цикл, сразу за фореву

              сбросы и сеты поправил.
              на яндексе код заработал. и на серве вроде тоже заработал.
              Сообщение отредактировано: sign63 -
                Цитата nemez @
                нужно в основной цикл, сразу за фореву

                Я как раз об этом предупреждал :yes:
                Это известная фишка селекта - после единственного срабатывания - все маски событий сбрасываются - и их надо восстанавливать снова..... :)
                Поэтому тут и пишется
                ExpandedWrap disabled
                  for ( ; ; )
                      {
                      FD_ZERO(&readfds);
                      FD_ZERO(&error_set);
                      FD_SET(sock, &readfds);
                      FD_SET(sock, &error_set);

                .............
                Ну а насчет как работает....
                Так этот код не был заточен под HTTP - естественно надо видоизменять......
                Теперь ваша задача - прочувствовать код......это сетевое программирование - а не хухры мухры.... :yes:
                  а еще вопрос.
                  принял я эти данные, хочу продолжать принимать дальше. комментирую break
                  программа сначала ждет принятия данных, каждые &tv печатает по точке, потом когда данные отосланы, принимает их, распечатывает, возвращается к select, он ей что то говорит и она пропускает чтение - начинает просто бесконечно из-за for (;;) ставить точки без всяких таймаутов. а что нужно сделать чтобы опять ждала принятия данных?
                  Сообщение отредактировано: sign63 -
                    селект возвращает единицу если он успешно отработал. Если селект вылетел по таймауту - он возвращает ноль. Если случилась ошибка - он возвращает отрицательный результат.
                    Точка у тебя печатается не по таймауту, а по любому из трех событий - прием данных, ошибка, таймаут. Это первое.
                    Чтобы оно не ставило точки - закоментируй принтф. Чтобы оно не вылетало по таймауту - передай в селект в качестве последнего аргумента ноль.
                      эмм, еще вопрос - моя готовая программка на локальном компе открывает порт, всё время разный. как можно указать собственный?
                      вот скрин http://imm.io/4nO
                        bind?
                        0 пользователей читают эту тему (0 гостей и 0 скрытых пользователей)
                        0 пользователей:
                        Страницы: (3) 1 2 [3]  все


                        Рейтинг@Mail.ru
                        [ Script execution time: 0,0471 ]   [ 16 queries used ]   [ Generated: 23.04.24, 17:56 GMT ]