c - 使用c通过tcp套接字处理图像

标签 c

我有一个小的 c 程序,它连接到我的安全 DVR 并进行身份验证,然后开始通过套接字向我发送数据。我可以连接到端口 5000 或端口 80,发送不同的身份验证方法以开始接收视频/图像。我的问题是;首先我是 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);

当我通过 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}Ìp6@>øÆÂòŸ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íRT@˙‚ìO7ÖÆÒ‘D<dm@;F®—yÑmPǃ5É+FZÀ"8≥-˙7"ç–ãm{Å∑Öunü»à·®icëcoDìf¬·ñ)!å A¡ñÂNrx√aeP\ZM®£      ‘Y\<kJÿ‚’Ó#„Œª+â3
    ¨π©%Uü±Àñ¨œò§S2àŸßUJjwûYãZ@Ç∆˚¶&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›.@nŸÍ±≈±Ê∏Ï~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 视频数据。

最佳答案

原始数据一张图片。它在终止标题的空行之后开始。

代码:

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 图像。

关于c - 使用c通过tcp套接字处理图像,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19484010/

相关文章:

将 system() 调用执行的命令的输出复制到 char 数组

c - GTK Glade 无法连接信号处理程序

c - 可中断就地排序算法

arrays - C中偶数数组的递归

国际象棋骑士游戏的复杂性

c - 如何在程序输出本身中查看当前进程状态

c++ - 已编译的 gcc 和 tcc 结构的兼容性

c - 无法在 c 中的 while 循环期间/之后清除字符串

C - 强制算术表达式的类型

c - 如何使用 printf 打印非空终止字符串?