gpt4 book ai didi

c - 为什么 getsockopt 返回错误?

转载 作者:可可西里 更新时间:2023-11-01 09:57:39 26 4
gpt4 key购买 nike

我遇到了 Windows 上套接字的问题。调用 getsockopt() 总是失败。奇怪的是 setsockopt() 似乎有效(至少它报告成功......虽然我设置的选项似乎没有我预期的效果)。

我的代码如下。运行它会报告成功的 setsockopt 调用,但 getsockopt 失败并返回 WSAEFAULT。我做错了什么?

        struct linger ling;

...

ling.l_onoff = 1;
ling.l_linger = 10;
if (setsockopt(sock, SOL_SOCKET, SO_LINGER, &ling, sizeof(ling)) == SOCKET_ERROR) {
fprintf(stderr, "******** setsockopt failed\n");
ret = -1;
break;
} else {
fprintf(stderr, "******** setsockopt success\n");
}
if (getsockopt(sock, SOL_SOCKET, SO_LINGER, &ling, sizeof(ling)) == SOCKET_ERROR) {
fprintf(stderr, "****** failed getting sockopt\n");
switch(WSAGetLastError()) {
case WSANOTINITIALISED:
fprintf(stderr, "******WSANOTINITIALISED\n");
break;
case WSAENETDOWN:
fprintf(stderr, "******WSAENETDOWN\n");
break;
case WSAEFAULT:
fprintf(stderr, "******WSAEFAULT\n");
break;
case WSAEINPROGRESS:
fprintf(stderr, "******WSAEINPROGRESS\n");
break;
case WSAEINVAL:
fprintf(stderr, "******WSAEINVAL\n");
break;
case WSAENOPROTOOPT:
fprintf(stderr, "******WSAENOPROTOOPT\n");
break;
case WSAENOTSOCK:
fprintf(stderr, "******WSAENOTSOCK\n");
break;
default:
fprintf(stderr, "******Unknown error %d\n", ret);
break;
}
}

最佳答案

getsockopt 的最后一个参数是一个指针,而不是 size_t。

来自 documentation 的注释getsockopt 声明为:

int getsockopt(
_In_ SOCKET s,
_In_ int level,
_In_ int optname,
_Out_ char *optval,
_Inout_ int *optlen
);

您需要初始化一个大小为 optval 的 int 并将指向该 int 的指针作为最后一个参数传递。将您的代码更改为:

int slen;
..
slen = sizeof ling;
getsockopt(sock, SOL_SOCKET, SO_LINGER, &ling, &slen)

关于c - 为什么 getsockopt 返回错误?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46000376/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com