Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/sockets/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
windows tcp套接字错误10045_C_Sockets_Winsock2 - Fatal编程技术网

windows tcp套接字错误10045

windows tcp套接字错误10045,c,sockets,winsock2,C,Sockets,Winsock2,我正在尝试创建一个服务器客户端,以便更好地了解它们的工作方式,但是我遇到了一个问题,每当我进行listen()调用时,windows会给我一个代码10045的错误,我查找了它,似乎是因为不支持该操作,然而,我不明白为什么会发生这种情况,因为据我所知,listen()调用应该在tcp套接字上工作。下面是我如何初始化套接字的源代码 WSADATA wsaData; WSAStartup(MAKEWORD(2,2), &wsaData); int sockfd, n; struct addr

我正在尝试创建一个服务器客户端,以便更好地了解它们的工作方式,但是我遇到了一个问题,每当我进行
listen()
调用时,windows会给我一个代码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;
}
WSADATA-WSADATA;
WSAStartup(MAKEWORD(2,2)和wsaData);
int-sockfd,n;
结构addrinfo提示,*servinfo;
memset(提示和提示,0,提示大小);
hits.ai_family=AF_unsec;
hits.ai_协议=SOCK_流;
hits.ai_flags=ai_被动;
if((n=getaddrinfo(NULL,argv[1],&hints,&servinfo))!=0){
fprintf(标准,“getaddrinfo:%s\n”,gai_strerror(n));
返回退出失败;
}
如果((sockfd=socket(servinfo->ai_系列,servinfo->ai_socktype,servinfo->ai_协议))<0){
fprintf(stderr,“%d\n”,WSAGetLastError());
佩罗(“插座”);
返回退出失败;
}
如果((n=bind(sockfd,servinfo->ai_addr,servinfo->ai_addrlen))=-1){
fprintf(stderr,“%d\n”,WSAGetLastError());
佩罗(“绑定”);
返回退出失败;
}
如果(侦听(sockfd,1)==-1){//错误
fprintf(stderr,“%d\n”,WSAGetLastError());
佩罗尔(“倾听”);
返回退出失败;
}

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

hints.ai_protocol = SOCK_STREAM;
如果您阅读,插座类型应位于
ai_socktype
字段中:

hints.ai_socktype = SOCK_STREAM;
由于您设置了错误的
ai_协议
socket
调用将为您创建错误类型的socket,而
listen
调用将失败

这里的课程是始终阅读文档。

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