首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> C語言 >> C++ >> C++ 入門

嵌入式網絡開發:ENC28J60 + MSP430G2553 移植 uIP 解決 Win7 無法訪問 HTTP 服務問題

     編輯:C++ 入門

問題現象

在 MSP430G2553 上用 ENC28J60 運行 uIP 協議棧搭建簡易 HTTP 服務器。XP 系統瀏覽器可正常訪問,但 Win7 瀏覽器無法連接,抓包發現 Win7 發送的 TCP 數據包缺少 Checksum(校驗和)字段(顯示為 0x0000),導致 uIP 直接丟棄該包。

根因分析

  • Win7 默認啟用 TCP Checksum Offload(校驗和卸載),由網卡硬件計算校驗和,驅動程序在發送給協議棧前不填充校驗和字段。
  • uIP 內部調用 uip_tcpchksum() 驗證校驗和,若為 0 則判定包錯誤並丟棄。
  • XP 默認不開啟 Offload,網卡驅動填充校驗和,故正常。

解決方案:修改 uIP 禁用校驗和驗證

在 uIP 源碼中找到校驗和驗證邏輯(通常在 uip_process() 或 uip_tcpinput() 中),將其註釋或條件編譯關閉:

// 原代碼片段
if (uip_tcpchksum() != 0) {
    uip_flags &= ~UIP_TCP_CHKSUM_OK;
    goto drop;
}

// 修改為
// if (uip_tcpchksum() != 0) { ... }  // 註釋掉,不再驗證校驗和
#define UIP_TCP_CHKSUM_OK 1  // 強制標記校驗和通過

或在項目配置中定義 UIP_CONF_TCP_CHECKSUM=0(視 uIP 版本而定)。

驗證結果

修改重新燒錄後,Win7 瀏覽器即可正常訪問 HTTP 服務,XP 仍正常。注意:禁用校驗和會降低數據完整性保障,但在受控局域網測試環境中可接受。生產環境建議在網卡驅動層關閉 Offload 或由軟件計算校驗和。

補充:關閉 Win7 網卡 Checksum Offload 步驟

  1. 設備管理器 → 網絡適配器 → 屬性 → 進階
  2. 找到 TCP Checksum Offload (IPv4)、UDP Checksum Offload (IPv4)
  3. 設置為 Disabled

此法無需修改嵌入式代碼,但需配置每台客戶端機器,適合調試階段。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved