看板 Network 關於我們 聯絡資訊
請問一下各位 小弟最近在撰寫發送網路卡封包的程式 在計算Tcp checksum的時候一直發生一個怪問題 就是checksum的值應該為 0xf3ac 的時候 我計算出來的都是 0xd3ac 我改變了封包的內容再算一次 正確的值應該是0xf3e7 我算出來是0xd3e7 我正確的值是用另外一個程式送 然後用wireshark去攔截回來看的 然後我再把這個正確的值直接填到我的封包中 我的封包就正常運作了 所以應該能確定是計算的時候出了問題 以下是我的程式碼 請給我一些意見 謝謝大家 P.S 一樣的這個涵式計算ip checksum的時候都正常沒有問題 只有計算tcp checksum會出錯 unsigned short GenerateChecksum(unsigned short *buffer,int size) { unsigned long cksum=0; while(size>1) { cksum+=*buffer++; size-=sizeof(unsigned short); } if(size) { cksum+=*(unsigned char *)buffer; } while (cksum>>16) { TRACE_RECORD; cksum=(cksum>>16)+(cksum & 0xffff); } return (unsigned short) (~cksum); } -- ※ 發信站: 批踢踢實業坊(ptt.cc) ◆ From: 61.220.71.34
zaknafein:其實這是程式問題=_= 12/28 20:43
overxxx:if(size)裡的值應該要<<8再加到checksum,因為是後面要補0 12/29 03:03
overxxx:但我不是很確定 12/29 03:14
overxxx:不然就是先把buffer的值印出來跟wireshark比對是不是一樣 12/29 03:19
overxxx:剛剛google發現到tcp checksum的計算有點不同,還要加 12/29 03:57
overxxx:src ip, dest ip, tcp port, tcp length 12/29 03:58