我在Windows上遇到了一个套接字问题。调用getsockopt()总是失败的。奇怪的是,setsockopt()似乎有效(至少它报告了success...although,我设置的选项似乎没有我预期的效果)。
我的密码在下面。运行它会报告一个成功的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;
}
}
发布于 2017-09-01 04:38:01
getsockopt
的最后一个参数是指针,而不是size_t。
请注意,文档声明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)
https://stackoverflow.com/questions/46000376
复制