首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >TCP_FASTOPEN未声明

TCP_FASTOPEN未声明
EN

Stack Overflow用户
提问于 2016-04-11 15:46:59
回答 2查看 2.4K关注 0票数 2

我正在编写一个通过TCP快速开放使用setsockopt()选项的小型服务器。然而,我从gcc那里得到了这个错误:

代码语言:javascript
复制
$gcc server.c
server.c: In function 'main':
server.c:35:34: error: 'TCP_FASTOPEN' undeclared (first use in this function)
    if (setsockopt(sock, IPPROTO_TCP, TCP_FASTOPEN, &qlen, sizeof(qlen) == -1)

以下是服务器的代码:

代码语言:javascript
复制
#include <stdio.h>
#include <errno.h>
#include <string.h>

#include <sys/types.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <netinet/ip.h>

int main(int argc, char *argv[])
{
    short port = 45000;
    int max_conn = 10;
    int fd = socket(AF_INET, SOCK_STREAM, 0);

    if (fd == -1)
    {
        printf("Couldn't create socket: %s\n", strerror(errno));
        return -1;
    }

    struct sockaddr_in ssi;
    ssi.sin_family = AF_INET;
    ssi.sin_port = htons(port);
    ssi.sin_addr.s_addr = INADDR_ANY;

    if (bind(fd, (struct sockaddr *)&ssi, sizeof(struct sockaddr_in)) != 0)
    {
        printf("Couldn't bind socket: %s\n", strerror(errno));
        return -1;
    }

    // TFO
    int qlen = 5;
    if (setsockopt(fd, IPPROTO_TCP, TCP_FASTOPEN, &qlen, sizeof(qlen)) == -1)
    {
        printf("Couldn't set TCP_FASTOPEN option: %s\n", strerror(errno));
        return -1;
    }

    if (listen(fd, max_conn) != 0)
    {
        printf("Could'nt listen on socket: %s\n", strerror(errno));
        return -1;
    }

    struct sockaddr_in csi;
    int clen = sizeof(csi);

    int cfd = accept(fd, (struct sockaddr *)&csi, &clen);

    return 0;
}

为什么gcc会犯这个错误?

TCP_FASTOPEN位于内核中的include/uapi/linux/tcp.h中,其值为23,因此我尝试在代码中重新定义它,然后它确实编译并运行,但是服务器没有发送该选项作为对TFO请求的答复(在SYN中)。

有人知道为什么吗?这与汇编问题有关吗?

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2016-04-12 08:29:42

启用服务器端使用TCP快速打开选项的/proc/sys/net/ipv4/tcp_fastopen 需要设置为2

可以使用tcp_fastopen文件查看或设置一个值,该值允许对TFO功能的不同部分进行操作。在此值中设置位0(即值1)可以启用客户端TFO功能,以便应用程序可以请求TFO。设置位1(即值2)启用服务器TFO功能,因此服务器TCPs可以响应客户端的请求生成TFO cookie。(因此,值3将启用主机上的客户端和服务器TFO功能。)

另外,TCP_FASTOPEN宏需要包含在#include <netinet/tcp.h>中。

票数 3
EN

Stack Overflow用户

发布于 2016-04-11 16:42:18

看起来您的glibc不支持TCP_FASTOPEN --即使您的keernel支持它(因为当您包含标准套接字头时它是不可用的)。因此,您不能真正使用glibc胶水代码( setsockopt()是其中的一部分)。

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

https://stackoverflow.com/questions/36553384

复制
相关文章

相似问题

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