// 读tcp 连接 int SocketManager::readFromTcpConn(fd_set *r_set, char *buffer, size_t size,int nready) { int ret = 0; std::vector<TcpSocket *>::iterator iter2; for (iter2 = m_tcp_conns.begin(); iter2 != m_tcp_conns.end();) { TcpSocket * sock = *iter2; if (FD_ISSET(sock->getSocketFd(), r_set)) { printf("receive from tcp conns [%d].\n", sock->getSocketFd()); ret = sock->recvMsg(buffer, size); if (ret > 0) { printf("buffer: %s\n", buffer); procTcpMsg(sock , buffer, size); iter2++; } else { if (ret == 0) { printf("the peer close the socket\n"); } else { perror("read"); } iter2 = m_tcp_conns.erase(iter2); delete sock; } if (--nready <= 0) { break; } else { continue; } } iter2++; } printf("readFromTcpConn nready[%d]\n", nready); return nready; }
int test_tcp_srv() { int ret; char buf[128] = {0}; TcpSocket tcp_srv; // open tcp_srv.open(); tcp_srv.setReuseAddr(1); tcp_srv.show(); // bind if (tcp_srv.bind(SocketIpv4Address("0.0.0.0", 8888)) < 0) { perror("bind"); return -1; } tcp_srv.show(); // listen if (tcp_srv.listen() < 0) { perror("listen"); return -1; } tcp_srv.show(); // accept TcpSocket *sock = tcp_srv.accept(); sock->show(); while(1) { ret = sock->recvMsg(buf, sizeof(buf)); if (ret == 0) { fprintf(stdout, "close the fd[%d]\n", sock->getSocketFd()); break; } else if (ret < 0) { perror("read"); break; } printf("ret: %d buf: %s\n", ret, buf); } tcp_srv.close(); return 0; }
int SocketManager::initSelect(fd_set *r_set, int *max_fd, struct timeval *timeout) { int ipv4_fd = -1; int netlink_fd = -1; int conn_fd = -1; ipv4_fd = m_tcp_sock ? m_tcp_sock->getSocketFd() : -1; netlink_fd = m_nl_sock ? m_nl_sock->getSocketFd() : -1; *max_fd = (ipv4_fd > netlink_fd) ? ipv4_fd : netlink_fd; FD_ZERO(r_set); if (-1 != ipv4_fd) { FD_SET(ipv4_fd, r_set); } if (-1 != netlink_fd) { FD_SET(netlink_fd, r_set); } std::vector<TcpSocket *>::iterator iter1; for (iter1 = m_tcp_conns.begin(); iter1 != m_tcp_conns.end(); ++iter1) { TcpSocket * sock = *iter1; conn_fd = sock ? sock->getSocketFd() : -1; printf("set fd conns [%d].\n", conn_fd); if (-1 != conn_fd) { FD_SET(conn_fd, r_set); } *max_fd = (*max_fd > conn_fd) ? *max_fd : conn_fd; } timeout->tv_sec = 20; printf("max_fd[%d]\n", *max_fd); return 0; }