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

      адрес 127.0.0.1:1234
      Сообщение отредактировано: Fireman -

      Прикреплённый файлПрикреплённый файлclient_server.zip (8.21 Кбайт, скачиваний: 171)
        а accept где? :o
          1. Не рекомендуется убивать поток извне
          ExpandedWrap disabled
                if (::WaitForSingleObject(m_hClientServerThread, 2000) == WAIT_TIMEOUT)
                    ::TerminateThread(m_hClientServerThread, 0);


          2. А где сопоставление сокета и Eventa? По моему, должно быть как-то так:
          ExpandedWrap disabled
               Event = WSACreateEvent();
               WSAEventSelect(Sock, Event, (FD_READ | FD_WRITE));

          А в цикле:
          ExpandedWrap disabled
            DWORD ret = WaitForMultipleObjects(3, evEvents, FALSE, INFINITE);
               status = WSAEnumNetworkEvents(Sock, SockEvent, &NetworkEvents);
               if (status == SOCKET_ERROR) {
                // ошибка
                DebugBreak();
               } else {
                   if ((NetworkEvents.lNetworkEvents & FD_READ) &&
                   (NetworkEvents.iErrorCode[FD_READ_BIT] == 0)) {
                   // есть данные для чтения - читаем
                   status = RecvHandler(port);
                   }
                   if ((NetworkEvents.lNetworkEvents & FD_WRITE) &&
                   (NetworkEvents.iErrorCode[FD_WRITE_BIT] == 0)) {
                   // возможна запись в сокет - записываем
                   status = XmitHandler(port);
                   }
               }


          Добавлено
          1. Не рекомендуется убивать поток извне
          ExpandedWrap disabled
                if (::WaitForSingleObject(m_hClientServerThread, 2000) == WAIT_TIMEOUT)
                    ::TerminateThread(m_hClientServerThread, 0);


          2. А где сопоставление сокета и Eventa? По моему, должно быть как-то так:
          ExpandedWrap disabled
               Event = WSACreateEvent();
               WSAEventSelect(Sock, Event, (FD_READ | FD_WRITE));

          А в цикле:
          ExpandedWrap disabled
               ...
               DWORD ret = WaitForSingleeObject(Event, FALSE, INFINITE);
               ...
               status = WSAEnumNetworkEvents(Sock, SockEvent, &NetworkEvents);
               if (status == SOCKET_ERROR) {
                // ошибка
                DebugBreak();
               } else {
                   if ((NetworkEvents.lNetworkEvents & FD_READ) &&
                   (NetworkEvents.iErrorCode[FD_READ_BIT] == 0)) {
                   // есть данные для чтения - читаем
                   status = RecvHandler();
                   }
                   if ((NetworkEvents.lNetworkEvents & FD_WRITE) &&
                   (NetworkEvents.iErrorCode[FD_WRITE_BIT] == 0)) {
                   // возможна запись в сокет - записываем
                   status = XmitHandler();
                   }
               }
            потоки - это все мелочи
            в конце концов они не влияют на работоспособность остального кода

            главный вопрос - почему код не работает как надо

            Добавлено
            popsa, точно !
            добавил после Listen accept

            ExpandedWrap disabled
                  m_pServerClientSocket2 = accept(m_pServerClientSocket, NULL, NULL);

            и send переделал в

            ExpandedWrap disabled
                  nNetOpResult = send(m_pServerClientSocket2, (char*)&szDataSize, sizeof(szDataSize), 0);


            все равно не работает :(

            Добавлено
            о - заработало

            1) пришлось и инициализацию сервера сунуть в отдельный поток (чтобы не висеть на accept)
            2) при неудачном recv не выходить из потока а крутиться в цикле

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


            Рейтинг@Mail.ru
            [ Script execution time: 0,0593 ]   [ 16 queries used ]   [ Generated: 28.04.24, 18:24 GMT ]