螢幕廣播的實現(上)

2022-08-27 07:06:09 字數 1748 閱讀 1089

所謂螢幕廣播,即是將指定計算機的的螢幕情況傳送至多台電腦,使那些電腦也能夠顯示出指定計算機的電腦桌面,一般是在電子教室之類的教學軟體中使用,最近為了在我們的乙個軟體中實現這個功能也費了不少功夫,所以在這裡總結一下實現方法。

螢幕廣播實現起來的方法其實也就是讓指定計算機不斷的螢幕截圖,然後將這些傳送至其他電腦,再讓那些電腦收到後顯示出來,這樣螢幕廣播的功能就實現了。今天我要說的只是如何傳送這些,至於螢幕截圖則有很多種方式在這裡不作闡述。

之所以螢幕廣播難以實現,主要就是螢幕廣播是要把一張傳送至多個電腦,如果採用tcp協議進行傳輸的話則必須向每乙個電腦傳送一張,這樣假如一張是100kb,同時傳送給10個計算機則需要將近1mb的資料傳輸量,這樣大的資料量顯然不能夠在實際中應用,所以在螢幕廣播時一般採用udp協議來傳輸。

udp是一種面向無連線的協議,之所以採用udp是因為在udp中有一種多播的技術,udp多播通過向乙個多播組中傳送乙個資料,那麼只要是在這個多播組中的主機都可以收到同樣的乙份副本。這樣如果要向10個主機傳送乙個100kb的的話,只要向乙個多播組傳送100kb的,那麼其他主機都可以收到,這樣即可以大大減小資料傳輸量。

程式設計實現起來也並不複雜,這裡給出用c語言實現的思路和方法。實現多播只需要三步:1、建立udp套接字;2、加入多播組;3開始傳送(接收)

以下是具體實現:

1、首先把頭檔案和庫包含進來

#include #pragma comment(lib,"ws2_32.lib")

2、初始化winsock庫並建立udp套接字

wsadata wsadata;

word wversionrequested;

wversionrequested = makeword(2,2

);if (wsastartup(wversionrequested,&wsadata)!=0

)socket ssender;

if(ssender ==invalid_socket)

3、加入多播組

//

填充廣播位址

sockaddr_in addrbroad;

addrbroad.sin_family =af_inet;

addrbroad.sin_port = htons(8742

);addrbroad.sin_addr.s_un.s_addr = inet_addr("

224.8.8.1");

//加入廣播組

socket srecver;

srecver = wsajoinleaf(ssender, (sockaddr*)&addrbroad, sizeof

(addrbroad), null, null, null, null, jl_both);

if (srecver ==invalid_socket)

4、開始傳送(接收)

傳送時使用sendto函式

sendto(ssender, buf, sizeof(buf), 0, (struct sockaddr*)&addrbroad, sizeof(addrbroad);

接收時使用recvfrom函式

int len = sizeof(struct

sockaddr);

recvfrom(srecver, buf,

sizeof(buf), 0, (struct sockaddr*)&broadaddr, &len);

參考資料:

操作螢幕上的視窗

未整理 tcsstr 字串1在字串2中首次出現的位置,未出現返回null值 tcsrchr 字元1 在字串2中首次出現的位置,未出現返回null值char szfilepath max path getmodulefilename null,szfilepath,max path tcsrchr s...

Linux UDP實現廣播

特點 較tcp來講udp無需建立連線可以直接傳送訊息,udp是對網路環境完全不彌補的協議,所以使用dup就要允許有一定的丟包率,udp廣播是面向區域網內所有的裝置的。對比tcp連線時服務端的ip位址的重要性來講,udp廣播中本機的ip顯得並不重要了。在udp廣播中不同於tcp的我們需要對網路套接字設...

c 區域網螢幕廣播二三事(1) 螢幕抓取

最近專案中需要,使用c 做了乙個簡版的教學軟體,過程中碰到過一些坑,也終於爬出來,現在隨著專案的收尾,想要通過部落格的方式來梳理和記錄一下相關東西。如下為對螢幕抓取封裝的capture,其中包含了滑鼠的繪製以及縮放功能。using system using system.collections.ge...