【问题标题】:windows tcp socket error 10045windows tcp套接字错误10045
【发布时间】:2017-12-22 19:55:39
【问题描述】:

我正在尝试创建一个服务器客户端,以便更好地了解它们的工作方式,但是我遇到了一个问题,每当我进行 listen() 调用时,窗口都会给我一个错误代码 10045,我查了一下,似乎是因为不支持该操作,但是我对为什么会发生这种情况感到困惑,因为据我所知,listen() 调用应该在 tcp 套接字上工作。这是我如何初始化套接字的源代码

WSADATA wsaData;
WSAStartup(MAKEWORD(2,2), &wsaData);

int sockfd, n;
struct addrinfo hints, *servinfo;

memset(&hints, 0, sizeof hints);
hints.ai_family = AF_UNSPEC;
hints.ai_protocol = SOCK_STREAM;
hints.ai_flags = AI_PASSIVE;

if((n = getaddrinfo(NULL, argv[1], &hints, &servinfo)) != 0){
    fprintf(stderr, "getaddrinfo: %s\n", gai_strerror(n));
    return EXIT_FAILURE;
}
if((sockfd = socket(servinfo->ai_family, servinfo->ai_socktype, servinfo->ai_protocol)) < 0){
    fprintf(stderr, "%d\n", WSAGetLastError());
    perror("socket");
    return EXIT_FAILURE;
}
if((n = bind(sockfd, servinfo->ai_addr, servinfo->ai_addrlen)) == -1){
    fprintf(stderr, "%d\n", WSAGetLastError());
    perror("bind");
    return EXIT_FAILURE;
}
if(listen(sockfd, 1) == -1){    //error
    fprintf(stderr, "%d\n", WSAGetLastError());
    perror("listen");
    return EXIT_FAILURE;
}

【问题讨论】:

  • 如果您阅读listen 参考,您会看到WSAEOPNOTSUPP(您得到的错误)意味着您尝试使用不支持侦听的套接字。检查servinfo 结构的内容以确保它都是有效的。或者循环遍历servinfo 列表,直到所有调用都成功(这是处理它的常用方法)。

标签: c sockets winsock2


【解决方案1】:

你设置了错误的协议/套接字类型:

hints.ai_protocol = SOCK_STREAM;

如果您阅读the addrinfo structure reference,则套接字类型应位于ai_socktype 字段中:

hints.ai_socktype = SOCK_STREAM;

由于您设置了错误的ai_protocolsocket 调用将为您创建错误类型的套接字,listen 调用将失败。

这里的教训是始终阅读文档。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-10-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-02-10
    • 2013-03-13
    相关资源
    最近更新 更多