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

Linux AIO是否支持原始套接字?
EN

Stack Overflow用户
提问于 2016-06-21 23:10:18
回答 1查看 217关注 0票数 0

我正在努力让AIO在Linux (版本3.19)上工作,以便在原始套接字上接收数据包,但无济于事。我已经成功地将AIO用于UDP和TCP套接字,但无法使其适用于原始套接字。我已经尝试过IPv4和IPv6了。

有人知道AIO是否支持原始套接字吗?

下面是我的应用程序中的一些代码片段:

代码语言:javascript
复制
void readCallback(sigval_t sigval) {
    debug(LOG_DEBUG, "RAW packet received\n");
}

int main(int argc, char *argv[]) {
    int sock = socket(domain, SOCK_RAW, IPPROTO_RAW);
    if (-1 == sock) {
    debug(LOG_CRIT, "FAILED to create raw socket\n");
    return 1;
    }

    char *iface = "eth0";
    ifreq ifr;
    memset (&ifr, 0, sizeof(ifr));
    snprintf (ifr.ifr_name, sizeof(ifr.ifr_name), "%s", iface);
    if (ioctl (sock, SIOCGIFINDEX, &ifr) < 0) {
    debug(LOG_CRIT, "FAILED to query interface '%s' index\n", iface);
    return 1;
    }

    // Set flag so socket expects us to provide IP header.
    const int on = 1;
    if (setsockopt(sock, IPPROTO_IP, IP_HDRINCL, &on, sizeof(on)) < 0) {
    debug(LOG_CRIT, "FAILED to configure raw socket on '%s'\n", iface);
    return 1;
    }

    // Bind socket to interface index.
    if (setsockopt(sock, SOL_SOCKET, SO_BINDTODEVICE, &ifr, sizeof(ifr)) < 0) {
    debug(LOG_CRIT, "FAILED to bind socket to %s/%u\n", iface, ifr.ifr_ifindex);
    return 1;
    }

    // listen for packets
    struct aiocb aio;
    char buf[MAX_PACKET];
    bzero((char*)&aio, sizeof(struct aiocb));
    aio.aio_fildes = sock;
    aio.aio_buf = &buf;
    aio.aio_nbytes = MAX_PACKET;
    aio.aio_offset = 0;
    aio.aio_sigevent.sigev_notify = SIGEV_THREAD;
    aio.aio_sigevent.sigev_notify_function = readCallback;
    aio.aio_sigevent.sigev_notify_attributes = NULL;
    aio.aio_sigevent.sigev_value.sival_ptr = buf;
    if (!RequestAioRead(&aio)) {
    debug(LOG_DEBUG, "FAILED to listen on raw socket...\n");
    return 1;
    }
    debug(LOG_DEBUG, "Listening on raw socket...\n");

    // main loop
    while (true) {
    usleep(100000);
    }
    close(sock);
    return 0;
}
EN

回答 1

Stack Overflow用户

发布于 2016-06-23 15:16:39

事实证明我的socket()协议是错误的。正确的协议似乎是htons(0x0800):

代码语言:javascript
复制
socket(AF_PACKET, SOCK_RAW, htons(0x0800));

有了这一点,aio似乎工作得很好。

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

https://stackoverflow.com/questions/37948200

复制
相关文章

相似问题

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