2017-08-27 118 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(); 
} 

選擇修改後的代碼用於輪詢的套接字描述符秒。當新的連接來到時,它被存儲在peersock中。然後選擇套接字描述符peersock作爲數據。如果讀取數據。如果有更多的接受描述符出現,則由(1)

+0

如果'BTSettingsTab'從'QDialog'衍生,你應該改名'無效BTSettingsTab ::接受()'的東西,不會覆蓋'聲明QDialog :: accept'。 –

+0

是BTSettingsTab派生自QDialog。但我沒有明確指出如何重命名BTSettingsTab :: accept(使用typedef或what) – chinmay

+0

如果我將accept的名稱更改爲accept1,那麼它將不會調用QDialogBu​​ttonBox的OK按鈕。我不明白你說的意思 – chinmay

回答

2

處理。QDialog::accept插槽設置接受狀態並關閉對話框。

您有一個BTSettingsTab派生自QDialog,它覆蓋了virtual void accept()成員函數。

如果您的實施void accept()應該執行與QDialog::accept相同的功能,您需要在函數結束時明確調用它。

例如:

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

我在最後添加了QDialog :: accept,但問題仍然存在 – chinmay

+0

如果我刪除套接字代碼,它工作正常 – chinmay

+0

只需再次查看您的代碼, :: accept'塊? –