int create_service_socket(){ int listenfd, connfd, newfd; struct sockaddr_in servaddr; struct sockaddr_in inaddr; char buffer[2048]; int rc; int done; int receiveLen; listenfd = socket(AF_INET, SOCK_STREAM, 0); bzero(&servaddr, sizeof(servaddr)); servaddr.sin_family = AF_INET; servaddr.sin_addr.S_un.S_addr = htonl(INADDR_ANY); servaddr.sin_port = htons(PORT); rc = bind(listenfd, (struct sockaddr *)&servaddr), sizeof(servaddr)); if(rc != 0){ printf("after bind, rc = [%d] \n", rc); return rc; } rc = listen(listenfd, MAX_CONNECT); if(rc == -1){ printf("listen error %d \n", errno); perror("listern error msg :"); return 1; } while(!done){ printf("waiting for connection \n"); newfd = accept(listenfd, &inaddr, sizeof(struct sockaddr_in)); if(newfd < 0){ printf("accept error : %d \n"m, errno); perror("accept error : "); return; } memset(buffer, 0, sizeof(buffer)); if((receiveLen = recv(newfd, buffer, 2048, 0)) < 0){ printf("recv error : %d \n"m, errno); perror("recv error : "); return; } printf("recv data : buffer = %s\n", buffer); handleReceiveData(buffer); if(strstr(buffer, "exit") != NULL){ done = 1; } close(newfd); } }
void read() { struct timeval timeout; timeout.tv_sec = 1; timeout.tv_usec = 0; std::vector<int> removeConnections; while (true) { FD_ZERO(&m_ConnSet); int max = 0; for(const auto& kvp : m_mapConnections) { if (kvp.second->m_fReseiveHandler != nullptr) { FD_SET(kvp.second->m_pSocket->m_iSocketHandle, &m_ConnSet); max = std::max(kvp.second->m_pSocket->m_iSocketHandle, max); } else { removeConnections.push_back(kvp.first); } } int h = ::select(max + 1, &m_ConnSet, NULL, NULL, &timeout); switch (h) { case -1: //clear set continue; case 0: //select timeout for (const auto &v : removeConnections) { auto con = m_mapConnections[v]; m_mapConnections.erase(v); delete con; } removeConnections.clear(); continue; default: //read handleReceiveData(); for (const auto &v : removeConnections) { auto con = m_mapConnections[v]; m_mapConnections.erase(v); delete con; } removeConnections.clear(); continue; } } }