2017-08-27 17 views
2

私のコードはQDialog ::受け入れは

void BTSettingsTab::accept() 
{ 
    struct sockaddr_rc loc_addr = { 0 }, rem_addr = { 0 }; 
    char buf[1024] = { 0 }; 
    char send[64] = {0}, temp[32]; 
    int s, client, bytes_read, bytes_written; 
    socklen_t opt = sizeof(rem_addr); 
    s = socket(AF_BLUETOOTH, SOCK_STREAM, BTPROTO_RFCOMM); 

    // bind socket to port 1 of the first available 
    // local bluetooth adapter 
    loc_addr.rc_family = AF_BLUETOOTH; 
    loc_addr.rc_bdaddr = (bdaddr_t){{0,0,0,0,0,0}};//*BDADDR_ANY; 
    loc_addr.rc_channel = (uint8_t) 1; 
    bind(s, (struct sockaddr *)&loc_addr, sizeof(loc_addr)); 

    // put socket into listening mode 
    listen(s, 1); 
    // accept one connection 
    client = ::accept(s, (struct sockaddr *)&rem_addr, &opt); 
    ba2str(&rem_addr.rc_bdaddr, buf); 
    fprintf(stderr, "accepted connection from %s\n", buf); 
    memset(buf, 0, sizeof(buf)); 
    strcat(send,passwd); 
    strcat(send,","); 
    snprintf(temp, sizeof(temp), "%ld", mobile_num); 
    strcat(send,temp); 
    strcat(send,","); 
    snprintf(temp, sizeof(temp), "%ld", imei); 
    strcat(send,temp); 
    //Thread_data * _data = new Thread_data(&s, send); 
    //pthread_create(&threadId,0,writeThread,_data); 


} 

私はX記号を使用してダイアログボックスを閉じますしようとすると、それは閉じないで閉じるには応答しません。何をすべきか?私はサーバーソケットを開いて接続を待ち受けています。それが理由かもしれません。の解き方?選択

void BTSettingsTab::accept() 
{ 
    int MAX_BUFFER_SIZE = 64; 
    struct sockaddr_rc loc_addr = { 0 }, rem_addr = { 0 }; 
    char buf[1024] = { 0 }; 
    char send[64] = {0}, temp[32]; 
    int s, client, bytes_read, bytes_written, maxfd; 
    int srvsock, peersock, j, result, result1, sent, len; 
    fd_set readset, tempset; 
    char buffer[MAX_BUFFER_SIZE+1]; 
    socklen_t opt = sizeof(rem_addr); 
    s = socket(AF_BLUETOOTH, SOCK_STREAM, BTPROTO_RFCOMM); 

    // bind socket to port 1 of the first available 
    // local bluetooth adapter 
    loc_addr.rc_family = AF_BLUETOOTH; 
    loc_addr.rc_bdaddr = (bdaddr_t){{0,0,0,0,0,0}};//*BDADDR_ANY; 
    loc_addr.rc_channel = (uint8_t) 1; 
    bind(s, (struct sockaddr *)&loc_addr, sizeof(loc_addr)); 

    // put socket into listening mode 
    listen(s, 1); 
    // accept one connection 
    FD_ZERO(&readset); 
     FD_SET(s, &readset); 
     maxfd = s; 
     do { 
      memcpy(&tempset, &readset, sizeof(tempset)); 

      result = select(maxfd + 1, &tempset, NULL, NULL, NULL); 

      if (result == 0) { 
      printf("select() timed out!\n"); 
      } 
      else if (result < 0 && errno != EINTR) { 
      printf("Error in select(): %s\n", strerror(errno)); 
      } 
      else if (result > 0) { 

      if (FD_ISSET(s, &tempset)) { 
       len = sizeof(rem_addr); 
       socklen_t opt = sizeof(rem_addr); 

       peersock = ::accept(s, (struct sockaddr *)&rem_addr, &opt); 
       if (peersock < 0) { 
        printf("Error in accept(): %s\n", strerror(errno)); 
       } 
       else { 
        FD_SET(peersock, &readset); 
        maxfd = (maxfd < peersock)?peersock:maxfd; 
       } 
       FD_CLR(s, &tempset); 
      } 

      for (j=0; j<maxfd+1; j++) { 
       if (FD_ISSET(j, &tempset)) { 

        do { 
         result = recv(j, buffer, MAX_BUFFER_SIZE, 0); 
        } while (result == -1 && errno == EINTR); 

        if (result > 0) { 
         buffer[result] = 0; 
         printf("Echoing: %s\n", buffer); 
         sent = 0; 

         do { 
         result1 = ::send(j, buffer+sent, result-sent, MSG_NOSIGNAL); 
         if (result1 > 0) 
          sent += result1; 
         else if (result1 < 0 && errno != EINTR); 
          break; 
         } while (result > sent); 

        } 
        else if (result == 0) { 
         ::close(j); 
         FD_CLR(j, &readset); 
        } 
        else { 
         printf("Error in recv(): %s\n", strerror(errno)); 
        } 
       }  // end if (FD_ISSET(j, &tempset)) 
      }  // end for (j=0;...) 
      }  // end else if (result > 0) 
     } while (1); 
    //client = ::accept(s, (struct sockaddr *)&rem_addr, &opt); 
    /*ba2str(&rem_addr.rc_bdaddr, buf); 
    fprintf(stderr, "accepted connection from %s\n", buf); 
    memset(buf, 0, sizeof(buf)); 
    strcat(send,passwd); 
    strcat(send,","); 
    snprintf(temp, sizeof(temp), "%ld", mobile_num); 
    strcat(send,temp); 
    strcat(send,","); 
    snprintf(temp, sizeof(temp), "%ld", imei); 
    strcat(send,temp);*/ 
    //Thread_data * _data = new Thread_data(&s, send); 
    //pthread_create(&threadId,0,writeThread,_data); 

    QDialog::accept(); 
} 

選択と

修正されたコードは、ソケットディスクリプタSをポーリングするために使用されます。新しい接続が来ると、それはpeersockに格納されます。次に、データ用のソケット記述子peersockを選択します。データが読み込まれた場合。記述子が来たら、それはwhile(1)によって処理されます。

+0

'BTSettingsTab'がQDialog''由来する場合、あなたは '無効BTSettingsTabの名前を変更する必要がありは::' QDialog :: accept'を上書きしないであろうものに ')(受け入れます。 –

+0

はいBTSettingsTabはQDialogから派生したものです。しかし、私はあなたのポイントをどのようにrenameBTSettingsTab :: accept(typedefまたは何を使用して) – chinmay

+0

の名前を変更した場合accept1にacceptを変更すると、それはQDialogBu​​ttonBoxのOKボタンを起動しません。私はあなたのポイントを得ていません – chinmay

答えて

2

QDialog::acceptスロットは受け入れられた状態を設定し、ダイアログボックスを閉じます。

から派生したクラスBTSettingsTabは、virtual void accept()メンバー関数よりも優先されます。

void accept()の実装でQDialog::acceptと同じ機能を実行する必要がある場合は、関数の最後に明示的に呼び出す必要があります。例えば

void BTSettingsTab::accept() 
{ 
    ... 
    QDialog::accept(); 
} 
+0

私は最後にQDialog :: acceptを追加しましたが、問題はまだそこにあります – chinmay

+0

ソケットコードを削除すると正常に動作します – chinmay

+0

あなたのコードをもう一度見て、 :: accept'ブロック? –

関連する問題