示例#1
0
void QImageGrabberMjpeg::downloadErrorSlot(QNetworkReply::NetworkError )
{
    if (reply != NULL) {
        errorStr = reply->errorString();
        emit errorHappend();
    }
}
示例#2
0
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);
				}
			}
		}

	}
}
示例#5
0
void QImageGrabber::setError(QString str) {
    errorStr = str;
    emit errorHappend();
    currentState = GrabbingError;
    emit stateChanged(GrabbingError);
}