getsockopt 返回负 mss(在 CLion 上)

Posted

技术标签:

【中文标题】getsockopt 返回负 mss(在 CLion 上)【英文标题】:getsockopt return negative mss (on CLion) 【发布时间】:2017-02-05 16:09:20 【问题描述】:

我遇到了一个问题,当我使用函数 getsockopt 获取 MSS 时,我得到了一个负数(或 0)。但是功能是成功的,套接字是正确的值hSocketService是正确的并且可以工作。

所以我得到了:

getsockopt OK
Taille maximale d'un segment = -13312

代码如下:

int tailleMsgRecu, nbreBytesRecus, finDetectee, tailleS, tailleO;


 /* 7. Recherche du MTU  -*-Mache pas-*-*/
    tailleO=sizeof(int);
    if (getsockopt(hSocketService, IPPROTO_TCP, TCP_MAXSEG, &tailleS, &tailleO) == -1)
    
        printf("Erreur sur le getsockopt de la socket %d\n", errno);
        exit(1);
    
    else
    
        printf("getsockopt OK\n");
        printf("Taille maximale d'un segment = %d\n", tailleS);
    

谢谢

编辑

我忘了确切地说我是在 Windows 上使用带有 Clion 的 cygwin 运行代码。

我更改了代码,现在tailleS 的类型为socklen_t,并使用printf("Taille maximale d'un segment = %u\n", tailleS); 打印其值 结果是Taille maximale d'un segment = 0

所以问题还是一样,即使 getsockopt 工作,我也没有得到正确的值。

【问题讨论】:

你在什么时候尝试这个?插座连接好了吗? 【参考方案1】:

您的tailleS 变量必须是socklen_t 类型,它在大多数平台上解析为无符号 值 - 但是,您可以使用有符号整数。这会使值乱码。

打印该值应该使用%u 格式说明符来告诉printf 这个变量是无符号的。

最后一句话:您似乎意识到您检索的不是 MTU,而是 TCP 段大小,这是另一回事(接近,但仍然不同)

【讨论】:

根据您提出的更改,我得到了这个:getsockopt OK Taille maximale d'un segment = 4294953984。是的,我知道,tcp seg 大小是我想要的,所以不用担心 和 socklen_t 类型的 tailleS 我得到了Taille maximale d'un segment = 0 您能否将上面的代码更新为 now 不起作用? @RémiHirtz 要正确执行此操作,您还需要将 taille0 = sizeof (int) 更改为 sizeof socklen_t - 尽管这可能无法正常工作。你的平台是什么? 啊。赛格温。很可能代码不起作用,因为 Windows 不支持该套接字选项(我在这里看不到):msdn.microsoft.com/en-us/library/windows/desktop/…

以上是关于getsockopt 返回负 mss(在 CLion 上)的主要内容,如果未能解决你的问题,请参考以下文章

OSX 上的getsockopt 返回不正确的值?

getsockopt(...,SO_ORIGINAL_DST,...) 偶尔返回客户端地址

getsockopt 返回与 setsockopt 中的一组不同的 IP_TOS 值

网络连接返回getsockopt: connection refused错误原因 及 listen

如何用getsockopt知道“序列号”?

如何在 Java 中调用 getsockopt 以获取 SO_ORIGINAL_DST