|
|
- void send_segment(struct iphdr *ih, struct tcphdr *th, char *data, int dlen) {
- char buf[65536];
- struct {
- unsigned long saddr, daddr;
- char mbz;
- char ptcl;
- unsigned short tcpl;
- } ph;
-
- struct sockaddr_in sin;
-
- ph.saddr=ih->saddr;
- ph.daddr=ih->daddr;
- ph.mbz=0;
- ph.ptcl=IPPROTO_TCP;
- ph.tcpl=htons(sizeof(*th)+dlen);
- [color=red]
- memcpy(buf, &ph, sizeof(ph));
- memcpy(buf+sizeof(ph), th, sizeof(*th));
- memcpy(buf+sizeof(ph)+sizeof(*th), data, dlen);
- memset(buf+sizeof(ph)+sizeof(*th)+dlen, 0, 4);
- th->check=ip_sum(buf, (sizeof(ph)+sizeof(*th)+dlen+1)&~1);
-
- memcpy(buf, ih, 4*ih->ihl);
- memcpy(buf+4*ih->ihl, th, sizeof(*th));
- memcpy(buf+4*ih->ihl+sizeof(*th), data, dlen);
- memset(buf+4*ih->ihl+sizeof(*th)+dlen, 0, 4);
- [/color]
- ih->check=ip_sum(buf, (4*ih->ihl + sizeof(*th)+ dlen + 1) & ~1);
- memcpy(buf, ih, 4*ih->ihl);
-
- sin.sin_family=AF_INET;
- sin.sin_port=th->dest;
- sin.sin_addr.s_addr=ih->daddr;
-
- if(sendto(sock, buf, 4*ih->ihl + sizeof(*th)+ dlen, 0, &sin, sizeof(sin))<0) {
- printf("*sight* Error sending packet...\n");
- exit(1);
- }
- }
复制代码 |
|