首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >为什么getsockopt返回一个错误?

为什么getsockopt返回一个错误?
EN

Stack Overflow用户
提问于 2017-09-01 12:32:03
回答 1查看 2.6K关注 0票数 2

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

我的密码在下面。运行它会报告一个成功的setsockopt调用,但是getsockopt在WSAEFAULT中失败。我做错了什么?

代码语言:javascript
复制
        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;
            }
        }
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2017-09-01 12:38:01

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

请注意,文档声明getsockopt为:

代码语言:javascript
复制
int getsockopt(
  _In_    SOCKET s,
  _In_    int    level,
  _In_    int    optname,
  _Out_   char   *optval,
  _Inout_ int    *optlen
);

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

代码语言:javascript
复制
int slen;
..
slen = sizeof ling;
getsockopt(sock, SOL_SOCKET, SO_LINGER, &ling, &slen)
票数 4
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/46000376

复制
相关文章

相似问题

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