首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >setsockopt返回-1: errno设置为0

setsockopt返回-1: errno设置为0
EN

Stack Overflow用户
提问于 2019-01-15 01:29:53
回答 1查看 181关注 0票数 0

我是网络编程的新手,我已经用Visual Studio 2015http://beej.us/guide/bgnet/html/multi/clientserver.html#figure2重写了A Simple Stream Server。在这里,我只发布代码的一部分(直到freeaddrinfo(servinfo)),因为问题已经存在。

代码语言:javascript
复制
// StreamServer.cpp : Defines the entry point for the console application.
#include "stdafx.h"
#include <csignal>
#include <cstdio>
#include <cstdlib>
#include <iostream>
#include <cstring>
#include <errno.h>

#include <string>
#include <sys/types.h>

#include "WinSock2.h"
#include "ws2ipdef.h"
#include "WS2tcpip.h"

#define PORT "3490" // the port users will be connecting to
#define BACKLOG 10  // how many pending connections queue will hold

// get sockaddr, IPv4 or IPv6:
void* get_in_addr(struct sockaddr* sa)
{
    if (sa->sa_family == AF_INET) {
        return &(((struct sockaddr_in*)sa)->sin_addr);
    }

    return &(((struct sockaddr_in6*)sa)->sin6_addr);
}

int main()
{
    WSAData wsaData;

    if (WSAStartup(MAKEWORD(2, 0), &wsaData) != 0) {
        std::cout << "WSAStartup failed." << std::endl;
        exit(1);
    }

    int sockfd, new_fd; // listen on sock_fd, new connection on new_fd
    struct addrinfo hints, *servinfo, *p;
    struct sockaddr_storage their_addr; // connector's address information
    socklen_t sin_size;
    int yes = 1;
    char s[INET6_ADDRSTRLEN];
    int rv;

    memset(&hints, 0, sizeof hints);
    hints.ai_family = AF_UNSPEC;
    hints.ai_socktype = SOCK_STREAM;
    hints.ai_flags = AI_PASSIVE; // use my IP

    if ((rv = getaddrinfo(NULL, PORT, &hints, &servinfo)) == -1) {
        return 1;
    }

    // loop through all the results and bind to the first we can
    for (p = servinfo; p != NULL; p = p->ai_next) {
        if ((sockfd = socket(p->ai_family, p->ai_socktype, p->ai_protocol) == -1)) {
            perror("server: socket");
            continue;
        }

        if (setsockopt(sockfd, SOL_SOCKET, SO_REUSEADDR, (char*)&yes, sizeof(yes)) == -1) {
            perror("setsockopt");
            exit(1);
        }

        if (bind(sockfd, p->ai_addr, p->ai_addrlen) == -1) {
            closesocket(sockfd);
            perror("server: bind");
            continue;
        }
        break;
    }

    freeaddrinfo(servinfo);

    WSACleanup();
    return 0;
}

setsockopt(...)失败并将errno变量设置为0。我还打印了这个错误,它显示为No error。我不明白我做错了什么。我认为程序应该在指定的端口上运行并等待,直到某个客户端向该端口发送数据。

EN

回答 1

Stack Overflow用户

发布于 2019-01-15 19:58:45

你是一种混合的习惯用法。

perror源于Linux (或者更广泛地说,是兼容errno的系统)上的编程,它将告诉您什么是POSIX。

但是Windows没有使用errno!要从Windows套接字函数中获取错误,您需要WSAGetLastError()。这应该会告诉您做错了什么(在本例中,为SO_REUSEADDR传递了错误类型的参数)。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/54186443

复制
相关文章

相似问题

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