linux环回接口,环回接口上的原始套接字是否可行?

原始套接字使用bind()和connect()表现得特别嘶哑,但我无法确认您的问题在于它们。我建议你遵循一个更简单的方法:

寄件人

#include

#include

#include

#include

#include

#include

#include

#define DEST "127.0.0.1"

int main(int argc, char **argv)

{

int s;

struct sockaddr_in dst_addr;

char packet[50];

struct iphdr *ip = (struct iphdr *)packet;

if((s = socket(AF_INET, SOCK_RAW, IPPROTO_RAW)) < 0) {

perror("error:");

exit(EXIT_FAILURE);

}

dst_addr.sin_family = AF_INET;

dst_addr.sin_port = 0; /* not needed in SOCK_RAW */

inet_pton(AF_INET, DEST, (struct in_addr *)&dst_addr.sin_addr.s_addr);

memset(dst_addr.sin_zero, 0, sizeof(dst_addr.sin_zero));

memset(packet, 'A', sizeof(packet)); /* payload will be all As */

ip->ihl = 5;

ip->version = 4;

ip->tos = 0;

ip->tot_len = htons(40);

ip->frag_off = 0; /* NF */

ip->ttl = 64;

ip->protocol = IPPROTO_RAW; /* this has to be IPPROTO_RAW */

ip->check = 0;

ip->saddr = dst_addr.sin_addr.s_addr;

ip->daddr = dst_addr.sin_addr.s_addr;

while(42) {

sleep(5);

if (sendto(s, packet, sizeof(packet), 0,

(struct sockaddr *)&dst_addr, (socklen_t)sizeof(dst_addr)) < 0)

perror("uh oh:");

}

return(0);

}

接收器

#include

#include

#include

#include

#include

#include

#include

int main(int argc, char **argv)

{

int s;

struct sockaddr_in src_addr;

char packet[50];

if ((s = socket(AF_INET, SOCK_RAW, IPPROTO_RAW)) < 0) {

perror("error:");

exit(EXIT_FAILURE);

}

memset(packet, 0, sizeof(packet));

socklen_t *len = (socklen_t *)sizeof(src_addr);

int fromlen = sizeof(src_addr);

while(42) {

if (recvfrom(s, &packet, sizeof(packet), 0,

(struct sockaddr *)&src_addr, &fromlen) < 0)

perror("uh oh:");

int i = sizeof(struct iphdr); /* print the payload */

for(; i < sizeof(packet); i++) {

printf("%c", packet[i]);

}

printf("n");

}

return(0);

}

我希望这些行为完全像你想要的那样。阅读man 7 raw了解其原因的详细信息,更重要的是man 7 packet如果你想扩展它。另外,请注意IPPROTO_RAW意味着IP_HDRINCL套接字选项,这就是我们自己构建ip头的原因 - 尽管IP校验和和总长度仍由内核计算和填充。

编辑:此外,如果你想要一个原始套接字用于将有效数据发送到像lighttpd这样的应用程序,你必须将protocol参数与socket()匹配,并为IP头字段提供有效值。正确的以太网头不是必需的 - 内核堆栈将为您填充唯一重要的字段。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值