最近编写一个原始套接字程序,自己构造IP包发送给对方,TCP和IP的校验和都计算正确了。测试的时候发现发送到不同网段成功,但是发送到同一网段却不行。
发送的代码大约是这样的:
后来发现,问题出在发送出去的IP与IP包的IP一致的时候,发送到同一网段就会失败。
将addr.sin_addr.s_addr = ip->SrcIP;修改成:addr.sin_addr.s_addr = inet_addr("1.1.1.1");后,同一网段也能发送成功了。
呵呵,看来还没摸到原始套接字的脾气!
发送的代码大约是这样的:
void Send(IP_HEADER* ip)
{
int sock = socket(AF_INET, SOCK_RAW, IPPROTO_ICMP);
assert(sock>0);
int nValue = 1;
setsockopt(sock, IPPROTO_IP, IP_HDRINCL, &nValue, sizeof(nValue));
struct sockaddr_in addr;
memset(&addr, 0, sizeof(struct sockaddr_in));
addr.sin_family = AF_INET;
addr.sin_addr.s_addr = ip->SrcIP;
sendto(sock, (void*)ip, ntohs(ip->Length), 0,
(struct sockaddr *)&addr, sizeof(struct sockaddr_in));
close(sock);
sock = 0;
}
{
int sock = socket(AF_INET, SOCK_RAW, IPPROTO_ICMP);
assert(sock>0);
int nValue = 1;
setsockopt(sock, IPPROTO_IP, IP_HDRINCL, &nValue, sizeof(nValue));
struct sockaddr_in addr;
memset(&addr, 0, sizeof(struct sockaddr_in));
addr.sin_family = AF_INET;
addr.sin_addr.s_addr = ip->SrcIP;
sendto(sock, (void*)ip, ntohs(ip->Length), 0,
(struct sockaddr *)&addr, sizeof(struct sockaddr_in));
close(sock);
sock = 0;
}
后来发现,问题出在发送出去的IP与IP包的IP一致的时候,发送到同一网段就会失败。
将addr.sin_addr.s_addr = ip->SrcIP;修改成:addr.sin_addr.s_addr = inet_addr("1.1.1.1");后,同一网段也能发送成功了。
呵呵,看来还没摸到原始套接字的脾气!