// // Created by matrixai on 3/26/24. // #include "BaseSocket.h" //构造函数 //输入参数:无 //输出参数:无 //返回值:无 BaseSocket::BaseSocket() { } //析构函数 //输入参数:无 //输出参数:无 //返回值:无 BaseSocket::~BaseSocket() { } //打开socket //输入参数:无 //输出参数:无 //返回值:无 void BaseSocket::Open() { nSocketId = socket(AF_INET, SOCK_STREAM, 0); //SOCK_NONBLOCK if(nSocketId == -1) { bRun = false; } else { struct timeval recvTimersetting; //接收超时时间固定3秒 recvTimersetting.tv_sec = 3; recvTimersetting.tv_usec = 0; //设定接收超时时间 setsockopt(nSocketId, SOL_SOCKET, SO_RCVTIMEO, &recvTimersetting, sizeof(recvTimersetting)); struct timeval sendTimersetting; //发送超时时间固定3秒 sendTimersetting.tv_sec = 3; sendTimersetting.tv_usec = 0; //设定发送超时时间c setsockopt(nSocketId, SOL_SOCKET, SO_SNDTIMEO, &sendTimersetting, sizeof(sendTimersetting)); } } //设定socket所用的IP对应的端口号 //输入参数: // int port: //输出参数:无 //返回值:无 void BaseSocket::SetPort(int port, std::string strIp) { memset(&serv_addr, 0, sizeof(serv_addr)); serv_addr.sin_family = AF_INET; serv_addr.sin_port = htons(port); //没有使用的端口 serv_addr.sin_addr.s_addr = inet_addr(strIp.c_str()); //本地所有的IP } //socket初始化,进行bind/listen/accept处理 //输入参数:无 //输出参数:无 //返回值:无 void BaseSocket::Init() { /* bind(nSocketId, (struct sockaddr*)&serv_addr, sizeof(serv_addr)); //请求排队的最大长度固定为64 listen(nSocketId, 64); struct sockaddr_in clien_addr; nConnectId = accept(nSocketId, (struct sockaddr*)&clien_addr, &clien_len); */ socklen_t serv_len = sizeof(serv_addr); nConnectId = connect(nSocketId, (struct sockaddr*)&serv_addr, serv_len); if(nConnectId >= 0){ bRun = true; } } //从socket读取数据 //输入参数:无 //输出参数:无 //返回值: // int len:读取到的数据长度 int BaseSocket::Read() { memset(chbuffer, 0x00, sizeof(chbuffer)); int len = recv(nSocketId, chbuffer, (sizeof(chbuffer) - 1), 0); if(nConnectId < 0 || len == 0) bRun = false; return len; } int BaseSocket::Monitor() { // memset(chbuffer, 0x00, sizeof(chbuffer)); // chbuffer[0] = 0x30; // int len = send(nSocketId, chbuffer, (sizeof(chbuffer) - 1), 0); std::string heart = "matrixai"; int len = send(nSocketId, heart.c_str(), (sizeof(heart) - 1), 0); if(nConnectId < 0 || len == 0) bRun = false; return len; } //返回socket状态是否连接 //输入参数:无 //输出参数:无 //返回值: // bool bRun:true正常运行 false未连接 bool BaseSocket::bRuning() { return bRun; } //关闭socket //输入参数:无 //输出参数:无 //返回值:无 void BaseSocket::Close() { if(nConnectId != 0){ close(nConnectId); } if(nSocketId != 0){ close(nSocketId); } bRun = false; }