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 上)的主要内容,如果未能解决你的问题,请参考以下文章
getsockopt(...,SO_ORIGINAL_DST,...) 偶尔返回客户端地址
getsockopt 返回与 setsockopt 中的一组不同的 IP_TOS 值