void QImageGrabberMjpeg::downloadErrorSlot(QNetworkReply::NetworkError ) { if (reply != NULL) { errorStr = reply->errorString(); emit errorHappend(); } }
void DataChannel::run() { int transferId; if(!receiveData(m_Socket, (char*)&transferId, sizeof(transferId))) { emit errorHappend(ReceiveDataError); return; } transferId = ntohl(transferId); DataServerThread* dataServer = DataServerThread::createDataServer(); DataTransfer* dataTransfer; try{ dataTransfer = dataServer->getAndPopTransfer(transferId); }catch(...) { qDebug()<<tr("无法找到对应的传送数据ID"); return; } unsigned long fileStatusCode; //客户端的文件是否存在等信息 if(!getFourByte(m_Socket, fileStatusCode)) { qDebug()<<tr("得到远程文件信息出错"); return; } unsigned long responseCode = 0; if(fileStatusCode == 0x1) //文件已经存在 { if(Parameters::transferExistsFileHandleCode == 0) //需要询问 { dataTransfer->setSomethingHappended(fileStatusCode); //通过GUI询问是否继续覆盖 dataTransfer->waitFor(); responseCode = dataTransfer->getResponseCode(); } else if(Parameters::transferExistsFileHandleCode == 1) //覆盖 { //不处理 responseCode = 1; } else if(Parameters::transferExistsFileHandleCode == 2) //跳过 { responseCode = 2; dataTransfer->setCancelled(); } else if(Parameters::transferExistsFileHandleCode == 3) //续传 { responseCode = 3; } } unsigned long tmpResponseCode = responseCode; if(!sendData(m_Socket, FBtoNetworkCharP(responseCode), sizeof(responseCode))) { qDebug()<<tr("回传是否覆盖文件代码出错!"); return; } if(tmpResponseCode == 3)//续传需要接受已有文件大小 { unsigned long lowPart,highPart; if(!getFourByte(m_Socket, lowPart)) { qDebug()<<tr("得到已有文件的大小的低字节部分出错!"); return; } if(!getFourByte(m_Socket, highPart)) { qDebug()<<tr("得到已有文件的大小的高字节部分出错!"); return; } long long fileExistsSize = lowPart | ( (long long)highPart << 32); dataTransfer->setPointer(fileExistsSize); } if(dataTransfer->isCancelled()) { return; } dataTransfer->setSomethingHappended(0x00); // 发送传送文件已经开始的信号 const unsigned long bufferSize = 20000; char* buffer = new char[bufferSize]; boost::scoped_array<char> bufferContainer(buffer); long long dataSize = dataTransfer->dataSize(); long long sendedSize = dataTransfer->getSendedSize(); //如果是续传这个值不会为0 long long remainedSize = dataSize - sendedSize; while(sendedSize < dataSize) { if(dataTransfer->isCancelled()) { break; } long long oneTimeSize = remainedSize < bufferSize ? remainedSize : bufferSize; long long readedSize = dataTransfer->readData(buffer, oneTimeSize); if(!sendData(m_Socket, buffer, readedSize)) { dataTransfer->setFailed(); emit errorHappend(SendDataError); return ; } sendedSize += readedSize; remainedSize -= readedSize; dataTransfer->setSendedSize(sendedSize); } closesocket(m_Socket); }
void RealTimeVideoServerThread::run() { SOCKET videoServerSocket; sockaddr_in videoBindAddress; videoServerSocket = ::socket(AF_INET, SOCK_STREAM, 0); if(videoServerSocket == INVALID_SOCKET) { qDebug()<<"Create realtime video server thread error"; emit errorHappend(WSAGetLastError()); return; } SocketCloser closer;closer.socket = videoServerSocket; int option = 1; int ret = setsockopt(videoServerSocket, SOL_SOCKET, SO_REUSEADDR, (char*)&option, sizeof(option)); if(ret == SOCKET_ERROR) { qDebug()<<"Set socket reuse address error"; } videoBindAddress.sin_family = AF_INET; videoBindAddress.sin_addr.s_addr = INADDR_ANY; videoBindAddress.sin_port = htons(VideoPort); ret = bind(videoServerSocket, (SA*)&videoBindAddress, sizeof(videoBindAddress)); if( ret == SOCKET_ERROR) { qDebug()<<"Bind realtime video socket error"; emit errorHappend(WSAGetLastError()); return; } ret = listen(videoServerSocket, SOMAXCONN); if(ret == SOCKET_ERROR) { qDebug()<<"Listen realtime video socket error"; emit errorHappend(WSAGetLastError()); return; } SOCKET audioServerSocket; audioServerSocket = ::socket(AF_INET, SOCK_STREAM, 0); if (audioServerSocket == INVALID_SOCKET) { qDebug()<<"Create audio sever socket error"; emit errorHappend(WSAGetLastError()); return; } SocketCloser audioSocketCloser;audioSocketCloser.socket = audioServerSocket; sockaddr_in audioBindAddress; audioBindAddress.sin_family = AF_INET; audioBindAddress.sin_addr.s_addr = INADDR_ANY; audioBindAddress.sin_port = htons(AudioPort); ret = bind(audioServerSocket, (SA*)&audioBindAddress, sizeof(audioBindAddress)); if (ret == SOCKET_ERROR) { qDebug()<<"Bind audio server socket error"; emit errorHappend(WSAGetLastError()); return; } ret = listen(audioServerSocket, SOMAXCONN); if (ret == SOCKET_ERROR) { qDebug()<<"Listen audio server socket error"; emit errorHappend(WSAGetLastError()); return; } int maxFd = videoServerSocket > audioServerSocket?videoServerSocket+1:audioServerSocket+1; fd_set fdSet; while(true) { FD_ZERO(&fdSet); FD_SET(videoServerSocket,&fdSet); FD_SET(audioServerSocket,&fdSet); int connectionCount = select(maxFd, &fdSet, NULL, NULL, NULL); if (connectionCount == SOCKET_ERROR) // 不用对connectionCount进行循环,因为外面的select会一直对有连接返回 { qDebug()<<"Select error"; emit errorHappend(WSAGetLastError()); return; } sockaddr_in clientAddress; clientAddress.sin_family = AF_INET; int addressLen = sizeof(clientAddress); SOCKET clientSocket; if(FD_ISSET(videoServerSocket, &fdSet)) { clientSocket = accept(videoServerSocket, (SA*)&clientAddress, &addressLen); if(clientSocket == INVALID_SOCKET) { qDebug()<<"Accept video client error"; continue; } g_DeviceCaptureAndSend->addVideoSocket(clientSocket); } else if (FD_ISSET(audioServerSocket, &fdSet)) { clientSocket = accept(audioServerSocket, (SA*)&clientAddress, &addressLen); if(clientSocket == INVALID_SOCKET) { qDebug()<<"Accept audio client error"; continue; } g_DeviceCaptureAndSend->addAudioSocket(clientSocket); } } }
void FileBrowserServerThread::run() { FileBrowserCreator* creator = FileBrowserCreator::instance(); connect(this, SIGNAL(newData(int,QByteArray)), creator, SLOT(onNewResponseMess(int,QByteArray)) ); connect(this, SIGNAL(newClientConnection(int)), creator, SLOT(onNewClientConnection(int))); connect(this, SIGNAL(errorHappend(int,int)), creator, SLOT(onErrorHappend(int,int))); int ret; m_Socket = ::socket(AF_INET, SOCK_STREAM, 0); if(m_Socket == INVALID_ATOM) { QMessageBox::critical(NULL, tr("严重错误"), tr("创建存储管理套接字失败!")+ WSAGetLastError()); return; } int reuseAddr = 1; ret = ::setsockopt(m_Socket , SOL_SOCKET, SO_REUSEADDR, (char*)&reuseAddr, sizeof(reuseAddr)); if(ret == SOCKET_ERROR) { qDebug()<<"Set socket reuse address error!"<<WSAGetLastError(); } unsigned long nonBlock = 1; ret = ::ioctlsocket(m_Socket, FIONBIO, &nonBlock); if(ret == SOCKET_ERROR) { qDebug()<<"Set socket non blocking error!"<<WSAGetLastError(); } sockaddr_in bindAddress; bindAddress.sin_family = AF_INET; bindAddress.sin_port = htons(FileBrowserPort); bindAddress.sin_addr.s_addr = INADDR_ANY; ret = ::bind(m_Socket, (SA*)&bindAddress, sizeof(bindAddress)); if(ret == SOCKET_ERROR) { QMessageBox::critical(NULL, tr("严重错误"), tr("绑定存储管理套接字失败\n") + WSAGetLastError()); return; } ret = ::listen(m_Socket, SOMAXCONN); if(ret == SOCKET_ERROR) { QMessageBox::critical(NULL, tr("严重错误"), tr("监听存储管理套接字失败\n") + WSAGetLastError()); return; } fd_set readSet; timeval waitTime; sockaddr_in clientAddress; int addrLen = sizeof(clientAddress); waitTime.tv_sec = 0; waitTime.tv_usec = 1000.0 / FrameRate; while(true) { int maxFd = m_Socket; FD_ZERO(&readSet); FD_SET(m_Socket, &readSet); int readyCount = ::select(maxFd, &readSet, NULL, NULL, &waitTime); if(readyCount == SOCKET_ERROR) { QMessageBox::critical(NULL, tr("严重错误"), tr("Select存储管理客户端套接字失败\n") + WSAGetLastError()); break; } //处理发送数据 m_SendDataListLock.lock(); while(m_SendDataList.size() > 0) { SendData& sendData = m_SendDataList.front(); int clientId = sendData.clientId; QByteArray& rawData = sendData.rawData; if(!m_ValidClients.contains(clientId)) { qDebug()<<"Not exists "<<clientId<<" to send data"; } else { PacketSocket* packetSocket = m_ValidClients.value(clientId); packetSocket->send(rawData); } m_SendDataList.pop_front(); } m_SendDataListLock.unlock(); //处理要关闭的连接 m_ToCloseListLock.lock(); while(m_ToCloseList.size() > 0) { int clientId = m_ToCloseList.front(); if(!m_ValidClients.contains(clientId)) { qDebug()<<"Not exists "<<clientId<<" to close socket"; } else { m_ValidClients[clientId]->close(); delete m_ValidClients[clientId]; m_ValidClients.remove(clientId); } m_ToCloseList.pop_front(); } m_ToCloseListLock.unlock(); //进行连接处理 if(FD_ISSET(m_Socket, &readSet)) { int clientSocket = ::accept(m_Socket, (SA*)&clientAddress, &addrLen); if(clientSocket == INVALID_SOCKET) { if(WSAGetLastError() == WSAEWOULDBLOCK) // 这种情况会发生吗? { //nothing wrong,just would block } else { QMessageBox::critical(NULL, tr("严重错误"), tr("得到存储管理客户端套接字失败\n") + WSAGetLastError()); break; } } else { qDebug()<<"New file browser connection:"<< inet_ntoa(clientAddress.sin_addr)<<":"<<clientAddress.sin_port; PacketSocket* packetSocket = new PacketSocket; packetSocket->setSocket(clientSocket); m_PendingSocketList.insert(packetSocket); } } //处理还不是有效的网络连接(没有发送客户端ID) QSet<PacketSocket*>::iterator pendingIt = m_PendingSocketList.begin(); while(pendingIt != m_PendingSocketList.end()) { PacketSocket* packetSocket = *pendingIt; packetSocket->process(); if(packetSocket->getStatus() == PacketSocket::Stop) { delete packetSocket; pendingIt = m_PendingSocketList.erase(pendingIt); } else { QByteArray rawData = packetSocket->receive(); if(rawData.size() != 0) { if(rawData.size() != sizeof(int)) { qDebug()<<"Serious problem,protocal not match"; } int clientId = ntohl( *(int*)rawData.data() ); m_ValidClients.insert(clientId, packetSocket); pendingIt = m_PendingSocketList.erase(pendingIt); emit newClientConnection(clientId); } else ++pendingIt; } } //处理所有的有效连接 QHash<int, PacketSocket*>::iterator validIt = m_ValidClients.begin(); while(validIt != m_ValidClients.end()) { int clientId = validIt.key(); PacketSocket* packetSocket = validIt.value(); packetSocket->process(); if(packetSocket->getStatus() == PacketSocket::Stop) { delete packetSocket; validIt = m_ValidClients.erase(validIt); emit errorHappend(clientId, WSAGetLastError()); } else { ++validIt; QByteArray rawData = packetSocket->receive(); if(rawData.size() != 0) { emit newData(clientId, rawData); } } } } }
void QImageGrabber::setError(QString str) { errorStr = str; emit errorHappend(); currentState = GrabbingError; emit stateChanged(GrabbingError); }