Windows的TCP套接字错误10045
问题描述:
我试图创建一个服务器客户端,所以我可以有一个更好的理解他们是如何工作的,但是我遇到了问题,每当我使listen()
调用窗口给我一个错误代码10045,我查了一下,它似乎是因为该操作不被支持,但我很困惑,为什么发生这种情况,因为从我所了解的listen()
调用应该工作在TCP套接字。下面是我如何初始化插座Windows的TCP套接字错误10045
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;
}
答
您设置了错误的协议/插座类型的源代码:
hints.ai_protocol = SOCK_STREAM;
如果你读the addrinfo
structure reference插槽类型应该在ai_socktype
领域:
hints.ai_socktype = SOCK_STREAM;
既然你设置了错误的ai_protocol
的socket
通话将创建错误类型插座的你,和listen
通话将失败。
这里的教训是总是阅读文档。
如果您阅读['listen'](https://msdn.microsoft.com/en-us/library/windows/desktop/ms739168(v = vs.85).aspx)参考,您会看到['WSAEOPNOTSUPP'](https://msdn.microsoft.com/en-us/library/windows/desktop/ms740668(v = vs.85).aspx#WSAEOPNOTSUPP)(你得到的错误)意味着你尝试使用不支持监听的套接字。检查'servinfo'结构的内容以确保它全部有效。或者遍历'servinfo'列表,直到所有调用都成功(这是处理它的常用方法)。 –