linux下构造TCP数据包的问题
- C/C++ code
#include <sys/socket.h>#include <sys/types.h>#include <netinet/ip.h>#include <netinet/tcp.h>#include <string.h>//伪头部struct psd{ struct in_addr src; struct in_addr dst; char zero; char p; unsigned short len;};//校验函数unsigned short chksum(unsigned char *data, int len){ int sum=0; int odd = len & 0x01; unsigned short *value = (unsigned short*)data; while( len & 0xfffe) { sum += *(unsigned short*)data; data += 2; len -=2; } if(odd) { unsigned short tmp = ((*data)<<8)&0xff00; sum += tmp; } sum = (sum >>16) + (sum & 0xffff); sum += (sum >>16) ; return ~sum; }//发送包void sendtcp(){ int ret =0; char buffer[1024]; struct psd * psd = (struct psd *)buffer; //伪头部 = 12字节 struct tcphdr *tcp = (struct tcphdr *)(buffer+12); struct sockaddr_in addr; int s = socket(AF_INET, SOCK_RAW, 6); memset(buffer, '\0', 1024); addr.sin_family = AF_INET; addr.sin_port = htons(80); addr.sin_addr.s_addr = inet_addr("192.168.205.64"); //目标地址 //伪头部 psd->src.s_addr = inet_addr("192.168.205.113"); //源地址 psd->dst.s_addr = inet_addr("192.168.205.64"); psd->p = 6; psd->zero = 0; psd->len = htons(8); //TCP数据包 = 64字节 tcp->source = htons(9090); tcp->dest = htons(80); tcp->seq = htons(1234); tcp->doff = 5; //TCP头部 = 5*4 = 20字节 tcp->syn = 1; tcp->window = htons(1024); tcp->check = htons(chksum(buffer, 76)); //伪头部 + TCP数据包 = 76字节 //TCP数据包 = 64字节 ret = sendto(s, (char*)tcp, 64, 0, (struct sockaddr*)&addr, sizeof(addr)); if(ret < 0) { perror("sendto"); } printf("send over, send %d bytes\n", ret);}int main(){ sendtcp(); return 0;}最近在学网络编程,想自己构造一个TCP包然后发送,可是使用上面的程序发送时始终收不到回复的ACK包,同一个目的地址,使用connect却可以抓到ACK包,请问上面的程序哪里出错了,该怎么改?
[解决办法]
http://blog.c114.net/html/87/367587-65637.html
参考,应该是你的tcp包没构造成功。