#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <unistd.h>
#include <errno.h>
#include <sys/socket.h>
#include <sys/ioctl.h>
#include <sys/types.h>
#include <netinet/in.h>
#include <netinet/ip.h>
#include <netinet/if_ether.h>
#include <net/if_arp.h>
#include <netpacket/packet.h>
#include <net/if.h>
#include <net/ethernet.h>
#include <linux/tcp.h>
#define BUFLEN 54
//CRC校驗和的計算
unsigned short check_sum(unsigned short *addr,int len){
register int nleft=len;
register int sum=0;
register short *w=addr;
short answer=0;
while(nleft>1)
{
sum+=*w++;
nleft-=2;
}
if(nleft==1)
{
*(unsigned char *)(&answer)=*(unsigned char *)w;
sum+=answer;
}
sum=(sum>>16)+(sum&0xffff);
sum+=(sum>>16);
answer=~sum;
return(answer);
}
int main(int argc,char** argv)
{
int skfd,n;
char buf[BUFLEN]={0};
struct ether_header *eth;
struct sockaddr_ll toaddr;
struct in_addr targetIP,srcIP;
struct ip *ip;
struct tcphdr *tcp;
struct ifreq ifr;
unsigned char src_mac[ETH_ALEN]={0};
unsigned char dst_mac[ETH_ALEN]={0};
unsigned char src_ip[15]={0};
unsigned char dst_ip[15]={0};
unsigned srcport, dstport;
printf("源MAC:");
scanf("%x:%x:%x:%x:%x:%x",
&src_mac[0],&src_mac[1],&src_mac[2],
&src_mac[3],&src_mac[4],&src_mac[5]);
printf("目標MAC:");
scanf("%x:%x:%x:%x:%x:%x",
&dst_mac[0],&dst_mac[1],&dst_mac[2],
&dst_mac[3],&dst_mac[4],&dst_mac[5]);
printf("源IP:");
scanf("%s",&src_ip);
printf("目標IP:");
scanf("%s", &dst_ip);
printf("目標埠:");
scanf("%d", &dstport);
printf("源埠:");
scanf("%d", &srcport);
if((skfd=socket(PF_PACKET,SOCK_RAW,htons(ETH_P_ALL)))<0)
{
perror("Create Error");
exit(1);
}
bzero(&toaddr,sizeof(toaddr));
bzero(&ifr,sizeof(ifr));
strcpy(ifr.ifr_name,argv[1]);
//獲取介面索引
if(-1 == ioctl(skfd,SIOCGIFINDEX,&ifr)){
perror("get dev index error:");
exit(1);
}
toaddr.sll_ifindex = ifr.ifr_ifindex;
printf("interface Index:%d\n",ifr.ifr_ifindex);
//開始填充,構造以太頭部
eth=(struct ether_header*)buf;
memcpy(eth->ether_dhost,dst_mac,ETH_ALEN);
memcpy(eth->ether_shost,src_mac,ETH_ALEN);
eth->ether_type = htons(ETHERTYPE_IP);
//開始填充IP首部
ip=(struct ip*)(buf+sizeof(struct ether_header));
ip->ip_v = IPVERSION;
ip->ip_hl = sizeof(struct ip)>>2;
ip->ip_tos = 0;
ip->ip_len = htons(sizeof(struct ip)+sizeof(struct tcphdr));
ip->ip_id=0;
ip->ip_off=0;
ip->ip_ttl=MAXTTL;
ip->ip_p=IPPROTO_TCP;
// ip->ip_sum=check_sum((unsigned short*)ip,sizeof(struct ip));
ip->ip_sum = 0;
inet_pton(AF_INET,dst_ip,&targetIP);
ip->ip_dst = targetIP;
inet_pton(AF_INET,src_ip,&srcIP);
ip->ip_src = srcIP;
//開始填充TCP首部
tcp = (struct tcphdr*)(buf+sizeof(struct ip)+sizeof(struct ether_header));
tcp->source = htons(srcport);
tcp->dest = htons(dstport);
tcp->seq = 0;
tcp->ack = 0;
tcp->window = htons(8192);
tcp->doff = 5;
tcp->syn = 1;
tcp->check = 0;
toaddr.sll_family = PF_PACKET;
tcp->check=check_sum((unsigned short*)tcp,sizeof(struct tcphdr));
ip->ip_sum=check_sum((unsigned short*)ip,sizeof(struct ip));
n=sendto(skfd,buf,BUFLEN,0,(struct sockaddr*)&toaddr,sizeof(toaddr));
close(skfd);
return 0;
}
以上為C程式原始碼

以上是兩windows機下.NET程式連接抓包結果

以上是linux下用C程式對windows發SYN包的結果(.NET程式監聽),收不到回復
這是怎么回事呢?大神求解
uj5u.com熱心網友回復:
沒人會嗎??uj5u.com熱心網友回復:
你先確定你發送的這個包的源MAC和目的MAC都填對了?uj5u.com熱心網友回復:
有沒有知道的。uj5u.com熱心網友回復:
1. 如果是 tcp 的話 你可以 通過 在 windows 下 用 telnet 鏈接抓包看看, 三次握手是否正常, 如果是正常的, 而你的程式不行說明你程式有問題, 如果 telnet 失敗 但是有 syn 發送 那么就看 你的linux 路由對不對了。uj5u.com熱心網友回復:
你的TCP資料是發給誰的呢 沒有說清楚呀感覺 只是發送到了對應IP的網卡上 但是網卡該把這個訊息交付給誰呢,還是說的埠號就是你對應的代碼或者應用呢 如果沒有接收方在你埠上,哪里來的回復呢?轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/131360.html
標籤:網絡協議與配置
