我是Windows套接字编程的新手。
我正在尝试编写一个简单的客户端程序,每次我使用127.0.0.1运行它时,connect函数总是返回bad file descriptor,因为某些原因。
有没有人能看一眼,告诉我为什么?我已经试了很久了。
if (argc != 2) {
fprintf(stderr,"usage: client hostname\n");
exit(1);
}
memset(&hints, 0, sizeof hints);
hints.ai_family = AF_UNSPEC;
hints.ai_socktype = SOCK_STREAM;
if ((rv = getaddrinfo(argv[1], PORT, &hints, &servinfo)) != 0)
{
fprintf(stderr, "getaddrinfo: %s\n", gai_strerror(rv));
return 1;
}
for(p = servinfo; p != NULL; p = p->ai_next)
{
if ((sockfd = socket(AF_INET,SOCK_STREAM,0)) == -1) {
perror("client: socket");
continue;
}
if (connect(sockfd , p->ai_addr, p->ai_addrlen,0) == -1) {
printf("hello\n");
close(sockfd);
perror("client: connect");
continue;
}
break;
}
if (p == NULL) {
fprintf(stderr, "client: failed to connect\n");
return 2;发布于 2015-05-05 03:55:06
您正在向socket()传递错误的参数值。您需要传递getaddrinfo()提供的套接字参数。您在调用getaddrinfo()时使用了AF_UNSPEC,因此它可以同时返回IPv4和IPv6信息,但是您将socket()调用硬编码为只创建IPv4套接字,因此如果您将IPv6地址传递给IPv4套接字,connect()将失败。
此外,您正在检查socket()的结果中是否有错误的错误值。与其他平台不同,Windows上的socket()返回SOCKET句柄而不是int文件描述符。您需要使用SOCKET变量而不是int变量,并将套接字与INVALID_SOCKET而不是-1进行比较。
此外,您必须使用closesocket()而不是close()来关闭SOCKET句柄。别忘了释放getaddrinfo()返回的列表。
SOCKET sockfd = INVALID_SOCKET;
//...
for(p = servinfo; p != NULL; p = p->ai_next)
{
if ((sockfd = socket(p->ai_family, p->ai_socktype, p->ai_protocol)) == INVALID_SOCKET) {
perror("client: socket");
continue;
}
if (connect(sockfd, p->ai_addr, p->ai_addrlen, 0) == -1) {
perror("client: connect");
closesocket(sockfd);
sockfd = INVALID_SOCKET;
continue;
}
break;
}
freeaddrinfo(servinfo);
if (sockfd == INVALID_SOCKET) {
fprintf(stderr, "client: failed to connect\n");
return 2;
}https://stackoverflow.com/questions/30017391
复制相似问题