void RemoteControlInterface::connectRemote(QString address, QString port, QString name) { bool ok = false; quint16 portInt = port.trimmed().toInt(&ok); if(ok) connectRemote(address.trimmed(), portInt, name); else emit(disconnected()); }
bool Transmitter::recConnectSock(int sockID, void* arg) { switch (runMode) { case CLIENT: { receiverConnectSock *conInfo = (receiverConnectSock*) arg; return connectRemote(sockID, conInfo->ipAddr, conInfo->port, conInfo); } case SERVER: sockInfo *si = new sockInfo; si->flag = WAIT_FIRST_PACKAGE; sockMap[sockID] = si; break; } return true; }
void ConfigDialog::connectButtonClicked() { if(ui->connectButton->text().remove('&')=="Connect"){ ui->serverAddress->setEnabled(false); ui->serverPort->setEnabled(false); ui->remoteName->setEnabled(false); ui->connectButton->setEnabled(false); ui->connectButton->setText("Connecting"); emit connectRemote(ui->serverAddress->text(), ui->serverPort->value(), ui->remoteName->text()); autoConnect= true; }else if(ui->connectButton->text().remove('&') == "Disconnect"){ emit disconnectRemote(); autoConnect = false; } }
bool Transmitter::recReceivingPackage(int sockID, void* arg) { receiverPackage *recvInfo = (receiverPackage *) arg; auto item = sockMap.find(sockID); if (item != sockMap.end()) { sockInfo &si = *item->second; if (si.flag == WAIT_FIRST_PACKAGE) { //发送 收到第一包 消息 wHook->pushAll("Transmitter Receiving First Package", sockID, recvInfo, true); /* * 第一包 * ---------------------------------------------------- * | Random Length | Random Content | IP | PORT | CRC | * ---------------------------------------------------- * | 1 | 1 ~ 4 | 4 | 2 | 1 | * ---------------------------------------------------- */ if (recvInfo->size < 8 || recvInfo->size > 12 || recvInfo->buf[0] > 4) { DEBUG("First Package Error : size " << recvInfo->size); closeQueue.push(sockID); return true; } if (getDataCRC(recvInfo->buf, recvInfo->size - 1) != recvInfo->buf[recvInfo->size - 1]) { DEBUG("First Package CRC Error"); closeQueue.push(sockID); return true; } uint8_t *offset = &recvInfo->buf[recvInfo->buf[0] + 1]; in_addr ip = *(in_addr*) offset; uint16_t port = *(uint16_t*) (offset + 4); connectRemote(sockID, ip, port, nullptr); DEBUG("firstPackage ok!"); return true; } //发送收到数据包消息 wHook->pushAll("Transmitter Receiving Data Package", sockID, recvInfo, true); if (si.canWrite) { auto sock = si.individual->getSocket(); int sendSize = sock.send(recvInfo->buf, recvInfo->size); if (sendSize < 0) { DEBUG("sendSize < 0"); } else if (sendSize < recvInfo->size) { si.lastSendBuf = autobuf; memcpy(si.lastSendBuf, recvInfo->buf + sendSize, recvInfo->size - sendSize); si.lastSendExcess = recvInfo->size - sendSize; si.canWrite = false; epoll.changeAdd(sock, Sock::EpollSocket::CanWrite); //暂停另一边的工作 DEBUG("===============暂停 " << sockID << " " << si.lastSendExcess); wHook->pushAll("Receiver Pause Sock", sockID, nullptr, true); } } else { if (si.lastSendExcess != -1) { DEBUG("sock " << sockID << " have some data"); return false; } si.lastSendBuf = autobuf; memcpy(si.lastSendBuf, recvInfo->buf, recvInfo->size); si.lastSendExcess = recvInfo->size; //暂停另一边的工作 DEBUG("暂停 " << sockID); wHook->pushAll("Receiver Pause Sock", sockID, nullptr, true); } } else { DEBUG("sock not find"); } return true; }