2

我在 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);

如果我使用“write”而不是 sendto,我会得到以下错误:“没有这样的设备或地址”(errno=6,定义为 EXNIO)。

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

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

我可能做错了什么?两个调用是等价的是否正确?

4

3 回答 3

3

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

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

于 2013-07-03T11:19:13.250 回答
3

您必须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);
于 2013-07-03T11:27:33.407 回答
0

此消息是由对不存在或超出设备限制的特殊文件的子设备的 I/O 导致的。所以检查一下,你是否有权限或访问权限来写你想要执行写操作的地方。还要更改写入参数,因为它只能有三个参数。

从手册页

int write(fd, buf, nbyte)

我希望这能解决问题。

于 2013-07-03T11:06:24.163 回答