套接字返回'没有这样的文件或目录“

时间:2009-12-10 07:27:36

标签: c sockets

Linux GCC 4.4.2

我正在做一些套接字编程。

但是,当我尝试从套接字函数中分配sockfd时,我一直收到此错误。

" Socket operation on non-socket"

非常感谢任何建议,

#if defined(linux)
#include <pthread.h>
/* Socket specific functions and constants */
#include <sys/types.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <netdb.h>
#include <errno.h>
#endif

#include "server.h"
#include "cltsvr_ults.h"

/* Listens for a connection on the designated port */
void wait_client()
{
    struct addrinfo add_info, *add_res;
    int sockfd;

    /* Load up the address information using getaddrinfo to fill the struct addrinfo */
    memset(&add_info, 0, sizeof(add_info));
    /* Use either IPv4 or IPv6 */
    add_info.ai_family = AF_UNSPEC; 
    add_info.ai_socktype = SOCK_STREAM;
    /* Fill in my IP address */
    add_info.ai_flags = AI_PASSIVE;

    /* Fill the struct addrinfo */
    int32_t status = 0;
    if(status = getaddrinfo(NULL, "6000", &add_info, &add_res) != 0)
    {
        fprintf(stderr, "getaddrinfo [ %s ]\n", gai_strerror(status));

        return;
    }

    if((sockfd = (socket(add_res->ai_family, add_res->ai_socktype, add_res->ai_protocol)) == -1))
    {
        fprintf(stderr, "Socket failed [ %s ]\n", strerror(errno));

        return;
    }

    /* Bind to the port that has been assigned by getaddrinfo() */
    if(bind(sockfd, add_res->ai_addr, add_res->ai_addrlen) != 0)
    {
        fprintf(stderr, "Bind failed [ %s ]\n", strerror(errno));

        return;
    }

    printf("Listening for clients\n");
}

使用旧式方法编辑==编码

    int32_t sockfd = 0;
    struct sockaddr_in my_addr;

    memset(&my_addr, 0, sizeof(my_addr));

    my_addr.sin_family = AF_INET;
    my_addr.sin_port = htons(6000);
    my_addr.sin_addr.s_addr = inet_addr("127.0.0.1");

    sockfd = socket(PF_INET, SOCK_STREAM, 0);
    if(sockfd == -1)
    {
    fprintf(stderr, "Socket failed [ %s ]\n", strerror(errno));
    return;
    }

    if(bind(sockfd, (struct sockaddr *) &my_addr, sizeof(my_addr)) == -1)
    {
    fprintf(stderr, "Bind failed [ %s ]\n", strerror(errno));
    return;
    }

2 个答案:

答案 0 :(得分:12)

您的主要问题是您在socket()出错时检查错误。 socket()将在出错时返回-1,而在成功时返回0。你可能会获得一个好的套接字值(2,3等)并将其视为错误。

您为代码括起来的方式还存在第二个问题。当你写:

if (sockfd = socket(add_res->ai_family, add_res->ai_socktype, add_res->ai_protocol) != 0)

这被视为:

if (sockfd = (socket(add_res->ai_family, add_res->ai_socktype, add_res->ai_protocol) != 0))

因此,不会为sockfd分配socket的返回值,而是将其与0进行比较的值。修复这两个问题,你应该写:

if ((sockfd = socket(add_res->ai_family, add_res->ai_socktype, add_res->ai_protocol)) == -1)

答案 1 :(得分:0)

我相信你应该指定你想要的套接字类型。当你说:

add_info.ai_family = AF_UNSPEC;
你应该说:

add_info.ai_family = AF_INET;