C語言的select函數可用于在多個文件描述符之間進行檢查,實現I/O多路復用。在實際應用中,我們通常需要將程序中select函數監測到的數據轉成JSON格式,以便進行更有效的操作和處理。
fd_set rset; FD_ZERO(&rset); FD_SET(sockfd, &rset); struct timeval t; t.tv_sec = 1; t.tv_usec = 0; int nread = select(sockfd + 1, &rset, NULL, NULL, &t); if(nread< 0){ perror("select error!"); exit(EXIT_FAILURE); } if(nread >0){ if(FD_ISSET(sockfd, &rset)){ char buf[MAXLINE]; memset(buf, '\0', sizeof(buf)); int nbytes = recv(sockfd, buf, MAXLINE-1, 0); if(nbytes< 0){ perror("recv error!"); exit(EXIT_FAILURE); } else if(nbytes == 0){ printf("client closed!"); } else{ printf("recv data:%s\n", buf); //將接收到的數據轉換為JSON格式 cJSON *root = cJSON_CreateObject(); if(root == NULL){ printf("create json root error!\n"); exit(EXIT_FAILURE); } cJSON_AddStringToObject(root, "data", buf); char *json = cJSON_Print(root); printf("json data:%s\n", json); //釋放JSON對象內存 cJSON_Delete(root); free(json); } } } else{ printf("select timeout!"); }
以上代碼中,我們通過select對客戶端連接進行監聽,并在接收到數據時將其轉換為JSON格式。接著調用cJSON庫中的函數cJSON_CreateObject()創建JSON對象,將數據添加到對象中,最后調用cJSON_Print()將JSON對象轉成字符串輸出。轉換完畢后,還需釋放對象內存和字符串內存,以免發生內存泄漏。