首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >winsock连接函数返回错误的文件描述符

winsock连接函数返回错误的文件描述符
EN

Stack Overflow用户
提问于 2015-05-04 01:59:23
回答 1查看 630关注 0票数 0

我是Windows套接字编程的新手。

我正在尝试编写一个简单的客户端程序,每次我使用127.0.0.1运行它时,connect函数总是返回bad file descriptor,因为某些原因。

有没有人能看一眼,告诉我为什么?我已经试了很久了。

代码语言:javascript
复制
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;
EN

回答 1

Stack Overflow用户

发布于 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()返回的列表。

代码语言:javascript
复制
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;
}
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/30017391

复制
相关文章

相似问题

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