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;