首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Linux原始套接字

Linux原始套接字
EN

Stack Overflow用户
提问于 2013-07-03 18:49:19
回答 3查看 3.7K关注 0票数 2

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

代码语言:javascript
复制
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',我想这两个系统调用是等价的。

我到底做错了什么?这两个调用是等价的,这是正确的吗?

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2013-07-03 19:19:13

下面是write函数的原型,它有3个参数,而不像send()函数那样有5个参数。

写入(int fd,const void *buf,size_t计数);

票数 3
EN

Stack Overflow用户

发布于 2013-07-03 19:27:33

您必须将地址bind() (see manual)到您的套接字,然后正确使用write() (也就是说,仅使用3参数)。

代码语言:javascript
复制
/* 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);
票数 3
EN

Stack Overflow用户

发布于 2013-07-03 19:06:24

此消息是由于对特殊文件的子设备的I/O导致的,该子设备不存在或存在于设备限制之外。因此,请检查您是否有权限或访问权限对要执行写入操作的位置进行写入。还要更改写参数,因为它只能有三个参数。

来自手册页

代码语言:javascript
复制
int write(fd, buf, nbyte)

我希望这能解决这个问题。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/17446001

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档