コード例 #1
0
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);
	}
}
コード例 #2
0
ファイル: AirClient.hpp プロジェクト: PengHao/Demo
 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;
         }
     }
 }