На главную Наши проекты:
Журнал   ·   Discuz!ML   ·   Wiki   ·   DRKB   ·   Помощь проекту
ПРАВИЛА FAQ Помощь Участники Календарь Избранное RSS
msm.ru
Модераторы: ElcnU
  
> WinCE 6.0 + сокет
    Отправляю бинарные данные на сервер посредством сокетов под WinCE 6.0. Когда отлаживаю программу в студии, получается, что устройство имеет доступ к интернету через комп, посредством Device Center. В этом случае, все работает прекрасно. Если же отключить устройство от компьютера, чтобы оно могло отправлять только через GPRS, то функция connect() отваливается с кодом 10035. Если же закомментировать строчки
    ExpandedWrap disabled
      unsigned long noblock=1;
          ioctlsocket( sock,FIONBIO,&noblock );
    то тогда отваливается уже функция send() с кодом 10054. Опять-таки, при подключении к компьютеру, все работает отлично. Что можно сделать, куда копать? Подскажите, пожалуйста.

    ExpandedWrap disabled
      DWORD WINAPI sender(DWORD param) {
       
          WSADATA wsaData;
          if(WSAStartup(MAKEWORD(2,2), &wsaData)) {
              write2log(L"WSAStartup error");
              WSACleanup();
              return 0;
          }
       
          SOCKET sock;
       
          sock = socket(AF_INET, SOCK_STREAM, 0);
          if(sock < 0) {
              wchar_t errText[128];
              wsprintf(errText,L"Socket error %d\n", WSAGetLastError());
              write2log(errText);
              return 0;
          }
       
          unsigned long noblock=1;
          ioctlsocket( sock,FIONBIO,&noblock );
       
          sockaddr_in dest_addr;
          dest_addr.sin_family = AF_INET;
          dest_addr.sin_port = htons(SERVER_PORT);
          HOSTENT *hst;
       
          if(inet_addr(SERVER_ADDR)!=INADDR_NONE) dest_addr.sin_addr.s_addr = inet_addr(SERVER_ADDR);
          else {
              if(hst=gethostbyname(SERVER_ADDR)) ((unsigned long *)&dest_addr.sin_addr)[0]=((unsigned long **)hst->h_addr_list)[0][0];
              else {
                  wchar_t errText[128];
                  wsprintf(errText,L"Invalid address %s\n", SERVER_ADDR);
                  write2log(errText);
                  closesocket(sock);
                  WSACleanup();
              }
          }
       
          if(connect(sock,(sockaddr *)&dest_addr, sizeof(dest_addr))) {
              wchar_t errText[128];
              wsprintf(errText,L"Connect error %d\n", WSAGetLastError());
              write2log(errText);
              closesocket(sock);
              WSACleanup();
              return 0;
          }
       
          timeval SendTimeout;
          SendTimeout.tv_sec  = 30;
          SendTimeout.tv_usec = 0;
          fd_set fds;
          FD_ZERO(&fds);
          FD_SET(sock, &fds);
       
          FILE * fp=_wfopen(path,L"rb");
          if(fp!=NULL) {
              char buff[160];
              while(!feof(fp)) {
                  int count=fread(&buff,sizeof(char),160,fp);
                  if(send(sock,request,count,0)==SOCKET_ERROR) {
                      wchar_t errText[128];
                      wsprintf(errText,L"Send error %d\n", WSAGetLastError());
                      write2log(errText);
                  } else {
                      select(0, &fds, NULL, NULL, &SendTimeout);
                      char reply[100];
                      int nsize=recv(sock,reply,sizeof(reply)-1,0);
                      if(nsize>0) {
                          //обработка ответа
                      }
                  }
              }
              fclose(fp);
          }
          closesocket(sock);
          WSACleanup();
          return 0;
      }
      Немного подправил код. Проблема теперь заключается в том, что вываливается send() с ошибкой 10054, но только под GPRS, с компьютера, опять-таки, все нормально. Как это исправить?
      ExpandedWrap disabled
        DWORD WINAPI sender(DWORD param) {
            WSADATA wsaData;
            if(WSAStartup(MAKEWORD(2,2), &wsaData)) {
                write2log(L"WSAStartup error");
                WSACleanup();
                return 0;
            }
         
            SOCKET sock;
         
            sock = socket(AF_INET, SOCK_STREAM, 0);
            if(sock < 0) {
                wchar_t errText[128];
                wsprintf(errText,L"Socket error %d\n", WSAGetLastError());
                write2log(errText);
                return 0;
            }
         
            unsigned long noblock=1;
            ioctlsocket( sock,FIONBIO,&noblock );
         
            sockaddr_in dest_addr;
            dest_addr.sin_family = AF_INET;
            dest_addr.sin_port = htons(SERVER_PORT);
            HOSTENT *hst;
         
            if(inet_addr(SERVER_ADDR)!=INADDR_NONE) dest_addr.sin_addr.s_addr = inet_addr(SERVER_ADDR);
            else {
                if(hst=gethostbyname(SERVER_ADDR)) ((unsigned long *)&dest_addr.sin_addr)[0]=((unsigned long **)hst->h_addr_list)[0][0];
                else {
                    wchar_t errText[128];
                    wsprintf(errText,L"Invalid address %s\n", SERVER_ADDR);
                    write2log(errText);
                    closesocket(sock);
                    WSACleanup();
                }
            }
         
            if(connect(sock, (sockaddr *)&dest_addr, sizeof(dest_addr))) {
                int err=WSAGetLastError();
                if(err!=WSAEWOULDBLOCK && err!=WSAEINPROGRESS) {
                    wchar_t errText[128];
                    wsprintf(errText,L"Connect error %d\n", err);
                    write2log(errText);
                    closesocket(sock);
                    WSACleanup();
                    return 0;
                }
            }
         
            timeval sockTimeout;
            sockTimeout.tv_sec  = 30;
            sockTimeout.tv_usec = 0;
         
            fd_set writefds;
            FD_ZERO(&writefds);
            FD_SET(sock, &writefds);
            if(select(sock, NULL, &writefds, NULL, &sockTimeout)==1 && FD_ISSET(sock, &writefds)) {
                write2log(L"Connection OK");
            } else {
                wchar_t errText[128];
                wsprintf(errText,L"Connection error %d\n", WSAGetLastError());
                write2log(errText);
                closesocket(sock);
                WSACleanup();
                return 0;
            }
         
            fd_set fds;
            FD_ZERO(&fds);
            FD_SET(sock, &fds);
         
            FILE * fp=_wfopen(path,L"rb");
            if(fp!=NULL) {
                char buff[160];
                while(!feof(fp)) {
                    int count=fread(&buff,sizeof(char),160,fp);
                    if(send(sock,buff,count,0)==SOCKET_ERROR) {
                        wchar_t errText[128];
                        wsprintf(errText,L"Send error %d\n", WSAGetLastError());
                        write2log(errText);
                    } else {
                        select(0, &fds, NULL, NULL, &sockTimeout);
                        char reply[100];
                        DWORD argp;
                        ioctlsocket(sock,FIONREAD,&argp);
                        if(argp>0) {
                            argp=(argp>sizeof(reply)-1)?sizeof(reply)-1:argp;
                            int nsize=recv(sock,reply,argp,0);
                            if(nsize>0) {
                                //Обработка ответа
                            } else sent=false;
                        } else sent=false;
                    }
                }
                fclose(fp);
            }
            closesocket(sock);
            WSACleanup();
            return 0;
        }
        Цитата bartwell @
        Как это исправить?

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


        Рейтинг@Mail.ru
        [ Script execution time: 0,0264 ]   [ 15 queries used ]   [ Generated: 2.05.24, 07:50 GMT ]