簡體   English   中英

QDialog :: accept不響應關閉

[英]QDialog::accept does not respond to close

我的代碼是

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();
}

select用於輪詢套接字描述符s。 隨着新連接的出現,它被存儲在peersock中。 然后選擇套接字描述符對等數據。 如果數據被讀取,如果有更多的接受描述符,則由while(1)處理

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

您有一個從QDialog派生的BTSettingsTab類, BTSettingsTab重寫了virtual void accept()成員函數。

如果您的void accept()應執行與QDialog::accept相同的功能,則需要在函數末尾顯式調用它。

例如:

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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM