【Windows上UltraVNC同Linux上TigerVNC之间实现文件传输———结构体rfbFileTransferMsg的发送和接收】

2 篇文章 0 订阅
2 篇文章 0 订阅

Windows上UltraVNC同Linux上TigerVNC之间实现文件传输———结构体rfbFileTransferMsg的发送和接收

结构体rfbFileTransferMsg的定义

UltraVNC对结构体的定义,共12个字节

typedef struct _rfbFileTransferMsg {
    CARD8 type;			/* always rfbFileTransfer */
    CARD8 contentType;  // See defines below
    CARD16 contentParam;// Other possible content classification (Dir or File name, etc..)
	CARD32 size;		// FileSize or packet index or error or other 
	// CARD32 sizeH;		// Additional 32Bits params to handle big values. Only for V2 (we want backward compatibility between all V1 versions)
    CARD32 length;
    /* followed by data char text[length] */
} rfbFileTransferMsg;

TigerVNC中没有这个结构体,需要我们自己定义如下,也是共12个字节

typedef struct _rfbFileTransferMsg {
    rdr::U8 type;			/* always rfbFileTransfer */
    rdr::U8 contentType;  // See defines below
    rdr::U16 contentParam;// Other possible content classification (Dir or File name, etc..)
	rdr::U32 size;		// FileSize or packet index or error or other 
	// rdr::U32 sizeH;		// Additional 32Bits params to handle big values. Only for V2 (we want backward compatibility between all V1 versions)
    rdr::U32 length;
    /* followed by data char text[length] */
} rfbFileTransferMsg;

Windows上UltraVNC发送结构体给Linux上TigerVNC

1、windows端发送。例如下

if (m_client->fFTRequest)
{
	rfbFileTransferMsg ft;
	ft.type = rfbFileTransfer;
	ft.contentType = rfbAbortFileTransfer;

	bool bOldFTProtocole = (msg.ft.contentParam == 0);
	if (bOldFTProtocole)
		ft.contentType = rfbAbortFileTransfer; // Viewer with New V2 FT protocole
	else
		ft.contentType = rfbFileTransferAccess; // Viewer with old FT protocole

	if (!bOldFTProtocole && m_server->FileTransferEnabled() && m_client->m_server->RemoteInputsEnabled() && fUserOk)
		ft.size = Swap32IfLE(1);
	else
		ft.size = Swap32IfLE(-1); 
	m_client->m_socket->SendExact((char *)&ft, sz_rfbFileTransferMsg, rfbFileTransfer);
	m_client->fFTRequest = false;
}

2、linux接收
这里不能像windows一样用以下下方法接收,因为接收到的结构体每个字段存在字节序的问题

rfbFileTransferMsg ft;
is->readBytes(((char *)&ft), sz_rfbFileTransferMsg);

这里改用TigerVNC带有的readU8()、readU16()、readU32()来读取,如下所示依次读取12字节

  int type = is->readU8();
  int c_contentType = is->readU8();
  int c_contentParam = is->readU8();
  int c_contentParam_sub = is->readU8();
  int c_size = is->readU32();
  int c_length = is->readU32();

Linux上TigerVNC发送结构体给Windows上UltraVNC

1、linux端发送
由于字节序的问题,这里也不能像windows一样用以下下方法发送,如下

rfbFileTransferMsg ft;
ft.type = msgTypeFileTransfer;
ft.contentType = rfbDirContentRequest;
ft.contentParam = rfbRDrivesList; // List of Remote Drives please
ft.length = 0;

char *char_ft = (char *)&ft;
os->writeBytes(char_ft, sz_rfbFileTransferMsg);

这里也改用TigerVNC带有的writeU8()、writeU16()、writeU32()来发送,如下所示依次发送12字节

os->writeU8(7);
os->writeU8(1);
os->writeU8(1);
os->writeU8(0);
os->writeU32(0);
os->writeU32(1022);

2、windows端读取
先读取一个字节

rfbClientToServerMsg msg;
if (!m_socket->ReadExact((char *)&msg.type, sizeof(msg.type)))
{
	m_client->cl_connected = FALSE;
	break;
}

再读取11个字节

if (m_socket->ReadExact(((char *) &msg) + 1, sz_rfbFileTransferMsg - 1))
{
}

rfbClientToServerMsg结构体如下,包含了rfbFileTransferMsg

typedef union {
    CARD8 type;
    rfbSetPixelFormatMsg spf;
    rfbFixColourMapEntriesMsg fcme;
    rfbSetEncodingsMsg se;
    rfbFramebufferUpdateRequestMsg fur;
    rfbKeyEventMsg ke;
    rfbPointerEventMsg pe;
    rfbClientCutTextMsg cct;
	rfbSetScaleMsg ssc;
	rfbPalmVNCSetScaleFactorMsg pssf;
	rfbSetServerInputMsg sim;
	rfbFileTransferMsg ft;
	rfbSetSWMsg sw;
	rfbTextChatMsg tc;
    rfbKeepAliveMsg kp;
	rfbRequestSessionMsg rs;
	rfbSetSessionMsg ss;
	rfbUserCloseMsg	close;
} rfbClientToServerMsg;
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值