所謂螢幕廣播,即是將指定計算機的的螢幕情況傳送至多台電腦,使那些電腦也能夠顯示出指定計算機的電腦桌面,一般是在電子教室之類的教學軟體中使用,最近為了在我們的乙個軟體中實現這個功能也費了不少功夫,所以在這裡總結一下實現方法。
螢幕廣播實現起來的方法其實也就是讓指定計算機不斷的螢幕截圖,然後將這些傳送至其他電腦,再讓那些電腦收到後顯示出來,這樣螢幕廣播的功能就實現了。今天我要說的只是如何傳送這些,至於螢幕截圖則有很多種方式在這裡不作闡述。
之所以螢幕廣播難以實現,主要就是螢幕廣播是要把一張傳送至多個電腦,如果採用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(structsockaddr);
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...