读书人

linux下构造TCP数据包的有关问题

发布时间: 2012-03-02 14:40:28 作者: rapoo

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包没构造成功。

读书人网 >UNIXLINUX

热点推荐