繁体   English   中英

Linux RAW套接字

[英]Linux RAW sockets

我在Linux / Debian上使用RAW套接字,当我使用write()而不是sendto()时遇到问题:

struct sockaddr_ll socket_address;
/* Index of the network device */
socket_address.sll_ifindex = if_idx.ifr_ifindex;
/* Address length*/
socket_address.sll_halen = ETH_ALEN;
/* Destination MAC */
socket_address.sll_addr[0] = 0x00;
socket_address.sll_addr[1] = 0x11;
socket_address.sll_addr[2] = 0x22;
socket_address.sll_addr[3] = 0x33;
socket_address.sll_addr[4] = 0x44;
socket_address.sll_addr[5] = 0x55;

/* Send packet */
int b_written = 0;

if ( ( b_written = write(sockfd, sendbuf, tx_len,
                                   (struct sockaddr*)&socket_address,
                                    sizeof(struct sockaddr_ll))) < 0 )
/*
if ( ( b_written = sendto(sockfd, sendbuf, tx_len, 0,
                                   (struct sockaddr*)&socket_address,
                    sizeof(struct sockaddr_ll))) < 0 )
*/
{
    perror("Could not write socket...");
    fprintf(stderr, "ERRNO = %d\n", errno);
    exit(-1);
}
printf("Packet sent!, Bytes written = %d\n", b_written);

如果我使用“写入”而不是sendto,则会出现以下错误:“无此设备或地址”(errno = 6,定义为EXNIO)。

使用“ sendto”我没有问题,数据包显示在“ tcpdump -nettti eth0'(ether dst host 00:11:22:33:44:55)'”中。

按照man(sendto),sendto等效于写操作,而不指定任何标志。 由于我用于“ sendto”的标志字段为“ 0”,因此我猜这两个系统调用都是等效的。

我做错了什么? 两个通话是否相等是正确的吗?

仅当套接字处于连接状态时才能使用sendto()调用(这样才能知道预期的接收者)。 以下是write函数的原型,它具有3个参数,而不是send()函数的5个参数。

write(int fd,const void * buf,size_t count);

您必须将地址bind()请参见手册 )到您的套接字,然后正确使用write() (这意味着,只有3个参数)。

/* Send packet */
int b_written = 0;

if (bind(sockfd, (struct sockaddr*)&socket_address, sizeof(struct sockaddr_ll)) == -1)
{
    perror("bind");
    exit(-1);
}
if ( ( b_written = write(sockfd, sendbuf, tx_len)) < 0 )
{
    perror("Could not write socket...");
    fprintf(stderr, "ERRNO = %d\n", errno);
    exit(-1);
}
printf("Packet sent!, Bytes written = %d\n", b_written);

此消息是由于I / O导致不存在或超出设备限制的特殊文件子设备的。 因此,请检查您是否有权限或权限在要执行写入操作的地方进行写入。 同时更改写参数,因为它只能具有三个参数。

从手册页

int write(fd, buf, nbyte)

我希望这能解决问题。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM