2013-10-20 97 views
1

我有一個小型的c程序,它與我的安全DVR進行連接並進行身份驗證,後者又開始通過套接字向我發送數據。我可以在端口5000或端口80上連接,發送不同的認證方法以開始接收視頻/圖像。我的問題是;首先,我對c是新手,並且對如何處理通過套接字接收的數據感到迷茫。這是我發送的用於驗證的數據。通過tcp socket與c處理鏡像

char authenticate[] = { 
    0x31, 0x31, 0x31, 0x31, 0x88, 0x00, 0x00, 0x00, 
    0x01, 0x01, 0x00, 0x00, 0x88, 0x7d, 0xa6, 0x47, 
    0x0c, 0x00, 0x00, 0x00, 0x78, 0x00, 0x00, 0x00, 
    0x03, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
    0x61, 0x64, 0x6d, 0x69, 0x6e, 0x00, 0x00, 0x00, 
    0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
    0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
    0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
    0x00, 0x00, 0x00, 0x00, 0x31, 0x32, 0x33, 0x34, 
    0x35, 0x36, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
    0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
    0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
    0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
    0x43, 0x6f, 0x6c, 0x74, 0x6f, 0x6e, 0x73, 0x2d, 
    0x4d, 0x61, 0x63, 0x42, 0x6f, 0x6f, 0x6b, 0x2d, 
    0x50, 0x72, 0x6f, 0x2e, 0x6c, 0x6f, 0x63, 0x61, 
    0x6c, 0x00, 0x00, 0x00, 0x35, 0x34, 0x32, 0x36, 
    0x39, 0x36, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00 
}; 

    x = sendto(sockfd, authenticate, sizeof(authenticate), 0, 
    (struct sockaddr*)&servaddr, sizeof(servaddr)); 

我然後用

while(1) 
{ 
    n = recvfrom(sockfd, data, 2048, 0, NULL, NULL); 

recieving數據當我通過連接http端口80這是我接收圖像數據:

Content-length: 2153 
Content-type: image/jpeg 

ˇÿˇ‡JFIFHHˇ€Cˇ€Cˇ¿#ˇƒ 
    ˇƒ8 2A!$X"#3QRTqëîóò「’÷ˇƒˇƒ@ 
     !1A"2QRqrë#SacÅ°¢≥—「ÒBCstÇí¥」ˇ⁄  ?e›n◊}mÀ⁄ÔÅ≥j¿ò[0ÂáֱNU…9'*‚®@ô &yéïùr‰Ù®{ï「däŒÆl$Kkë  R,√fƒSl—EX 
    z \û£≠âflüÈ‚≠ê*àÉ*—1E;q}Ì[email protected]>øÆÂòŸR≠^Ì˝çò ı;R∆b¡»ü>aÊ∫a˙5KKüz∑¶Î´D「≤κl∂ÎÓ„∆Àn∫¥•sh8vß4≠äöûñy‰H¢çyºí0TQrÏ@π dÅèåfi*XY*F¨Óƒl™¢‰˝S^sgh]î…flzXNü‡†2∑ñæ5t€Tp`qìåos◊iGùjˆ˙+FÈ™‚‘_§≈[」Jˇ  *•<*´∆≥ÁpVGfl 
    ï¶ñ—€{ñgíJmd*ôï„å[YT-J†∞π∂¯ë…{¶dyÓaÓhå©!øg⁄∆™≤È: 
    ≥Ô`Mú)∞ÚÌǯhˇÿ„Tø∑,9˛õ°˛ıØö~ø«ûÔ˝˙aa{ÜÔû÷Èé‡ÂΩk÷ºµ\sÉÒ¬XÓ∞`¯⁄X「">eäÅœ»G¡ìöÜ"˘mütòÅtuÓbÌh;vB1dflL ∂) 
    ´È 
    Hm∂Í 
    Ω¡î*Ä≤e‘nÄï‘HΩ…77ÙIè6%â%ãµ"T¿n¢Í3%‹zj#™:」ÂmR˛=L ZsZ[_ïz±»r…™2®ú.«]∑$q¢1)ùftÙ˘îà[q£°Îü&%Ï÷@á∂¿ôEy!ËÇJ0‚‚j»¥|∆fi–ü5"èRj›D˘„õUäú≥û>•«bdôãq]Ö$2ˆ„Gc#,ó±Ò<√-p}ZÍSÛ               £ëóŒsäóNçı≠◊òÊö•mÈÇ_W„Y2∆∫9œxπŸ¸*±’dË⁄1(¸05{üfW∆Éû 
    ‘ÿSÑ‘„û.JTÓ9˙Ìø˝∆º=∆  ¬ï∆h≥!`uˆ’Uçõèd„Ï…ı®*GÕıŸ6iíÆiñ¶’ØmBë‰WáÈö˛â‚ı∞>Ó˛◊_Â’ˇπ?º」˘øh~8TÔÕ/ùˆO¬Ewü^◊]…6 
    ÕïÊ«p2ˆ◊ä」õU÷ËÖˆ◊䲲ãk–«_2ûk4Éÿ‰aÖƒîP∑ùg⁄†·¢µ’ÂS÷}XNï¯5GWæßGk」óS8fòˇ;˝âp;≈「ƒ5ˇ˜„Éû·&Áa¨ö2tÿ±íÉìcÇeÓ"¬Â„(8¯:øØíM £rmfiá~≠æ(:oT/U≤/täó  U√ñT0ëªÕ  ê’¢ví[email protected]˙‚ìO7ÖÆÒ‘D<[email protected];F®—yÑmPǃ5É+FZÀ"8≥-˙7"ç–ãm{Å∑Öunü»à·®icëcoDìf¬·ñ)!å A¡ñÂNrx√aeP\ZM®£  ‘Y\<kJÿ‚’Ó#„Œª+â3 
    ¨π©%Uü±Àñ¨œò§S2àŸßUJjwûYã[email protected]Ç∆˚¶&hr⁄xj¬ì È™sàK-… 28Fm‡Ôr√û  8Qè 
    ª∑ØP ptt£‚N—Œ∆Iπ ıo«Y{Èe.U[´‰•ı∫ÎæöÙU’‘…)¶Gy 
    †「ä]ãä6U≤Å∞b 7X„  ™˙@ÓMÖ∑>_ó 
    =fiÔ>·π∂ˇ÷ãÎΩfl«Y!µÎô≥—ß;¨J™èΩ|tLoîRˇM›[email protected]ŸÍ±≈±Ê∏Ï~qkãsv≈Xõ‰í∞Lπ/cR,j*6.Sí„ÿ˘fÑ»7f|_™≥RçÿíE°°bã {{Ïõç#·Ãæ:7çú√´u  o 
    ⁄N¨Ω\€ù◊K,Z4àÕ8N\˙πÍë’D∫vbfl∏¢>äz.¸¨⁄Ä‘°dx≈ªàˆÕ45‡ßõub-ü%TVTN8⁄∞¨≤µÁñÜD[;o—˘ƒNˇóóØ[ò;´¡O*∫¿ƒ©∏2ߘG#20˘H∆µªú’2€∂O°Â⁄Ùb®äÌ/hÿQÁXÓŸJzB¬Öw]Ù2ÿ—⁄§∆«gÜö·´˚Ëãt‚+˛Iì¯∂⁄nÎ{ºVʬ)aà∆´°ÀÚËÃkr÷â„ç^1©ôæ 
    óv'ô8∆ãπkB˙цπ¯zÉsÀpv;Ã]ÓI€[Ìj/˙A≤øÒ}O˚ËS|Dûƒˇ¶3=ÓÍæ6?Ú…å!¥›¨Ûˆ¸f…€·I~à≥  g>∆®‰√Û0≥30®Æ) èMÖçGÃ∑dÑÖ∞¥Œéf≥ÔyµE¢Yå.õ·ç+r˙ú ≤ZÄP ‰y¨Km⁄±~ävfl¡'I+b»Ñî[ö<¬  æñ8raEãk 

我不能確定如果此數據是一些奇怪的編碼,或者如果它需要處理某種方式使其有效。我已經搜索了沒有運氣或如何正確做到這一點的例子。如果我通過數據端口(端口5000通過發送通過而不是圖像)數據看起來幾乎相同,但我知道它可能是處理或未處理的H.246視頻數據。

+0

只能通過80端口嗎?如果從非保留端口連接(如5055),會發生什麼情況?同時向我們展示如何在接收端處理陣列數據' – sukhvir

+0

看起來像您試圖將二進制數據可視化爲字符......您能分享您的輸出方法嗎? – xmoex

+0

唯一可用的其他端口是5000,用於將視頻發送到客戶端。當我使用端口5000時,它向我發送有關每個攝像機設置的信息,然後向我發送與上述圖像數據幾乎相同的視頻數據。我沒有訪問服務器端代碼,這是另一個問題。 – csechols

回答

0

原始數據的圖像。它在終止標題的空白行之後開始。

代碼:

n = recvfrom(sockfd, data, 2048, 0, NULL, NULL); // might as well replace with read(). 
// use a much larger buffer, ideally large enough to fit largest possible whole image 

headers_end_str = "\r\n\r\n"; 
headers_end_position = strstr(data, headers_end_str); 
headers_end_position += strlen(headers_end_str); 

if (headers_end_position > n) { ... } // handle errors 

FILE* fh = fopen("image.jpg", "wb"); 

int result = fwrite(&(data[ headers_end_position), n - headers_end_position, 1, fh); 
// check result for errors 

// continue reading from socket and writing to file, subsequent reads do not have headers 

這應該讓你開始,你需要微調讀數的其它數據,並且還錯誤處理和文件的末尾。

但是,即使在完成所有這些之前,您應該可以運行「file -s image.jpg」(在linux或cygwin上),它會告訴你它是一個JPEG圖像。

0

我使用WireShark來監視DVR和它的Web瀏覽器插件客戶端之間的通信,並且驗證消息標題與您的文章(0x31 0x31 0x31 0x31 ...)類似。你是如何構建這個數組的?我搜索了很多這個協議文檔,但我沒有找到。

在我的情況下,我做的端口7171(這是一個DVR設置)的請求。我還用了一段時間(真)來監聽這個端口,服務器給我發送一個h264流。

問題是,流是不是像rtps協議描述,看到這個偉大的post。在我們的例子中,我們必須首先解析一種專有標頭(以0x31 0x31 0x31 0x31開始)來標記幀,sps和pps。