套接字:listen()函数中的结果太大[关闭]

Posted

技术标签:

【中文标题】套接字:listen()函数中的结果太大[关闭]【英文标题】:Sockets: result too large in listen()-function [closed] 【发布时间】:2013-05-28 11:44:36 【问题描述】:

C++ 套接字的另一个“结果太大”问题并没有太大帮助。我有一个服务器代码,但每次我运行它时,我都会得到一个“结果太大”的listen()函数错误。希望,你能帮上忙!

SOCKET sd;
SOCKET sd2;

char serve_1_clien_0_intern;
    struct sockaddr_in server;
    struct sockaddr_in client;

void udp_init(unsigned short port_number, int a1, int a2, int a3, int a4, char serve_1_clien_0 )

    WSADATA w;                          
    serve_1_clien_0_intern = serve_1_clien_0;



    if (WSAStartup(0x0101, &w) != 0)
        fprintf(stderr, "Could not open Windows connection.\n");
        return;
        exit(0);
    


    sd = socket(AF_INET, SOCK_DGRAM, 0);
    if (sd == INVALID_SOCKET)
        fprintf(stderr, "Could not create socket.\n");
        WSACleanup();
        return;
        exit(0);
    

    memset((void *)&server, '\0', sizeof(struct sockaddr_in));


    server.sin_family = AF_INET;
    server.sin_port = htons(port_number);
    
        server.sin_addr.S_un.S_un_b.s_b1 = (unsigned char)a1;
        server.sin_addr.S_un.S_un_b.s_b2 = (unsigned char)a2;
        server.sin_addr.S_un.S_un_b.s_b3 = (unsigned char)a3;
        server.sin_addr.S_un.S_un_b.s_b4 = (unsigned char)a4;
    


    if(serve_1_clien_0_intern==1)

        if (bind(sd,(struct sockaddr *)&server,sizeof(struct sockaddr_in)) == SOCKET_ERROR)
            fprintf(stderr, "Could not bind name to socket, Maybe wrong IP-ADRESS??\n");
            closesocket(sd);
            WSACleanup();
            return;
            exit(0);
        


        if(listen(sd,10) == SOCKET_ERROR)
            perror("listen");
            exit(0);
        

        int sin_size;
        sin_size = sizeof(struct sockaddr_in);
        if ((sd2 = accept(sd, (struct sockaddr *)&client,&sin_size)) == SOCKET_ERROR)
            perror("accept");
            exit(0);
        
       

【问题讨论】:

我见过的每个调用listen() 的例子都使用5 或更小。我从来没有研究过为什么会这样,但在你的情况下,你是否计划让超过 5 个客户端调用 connect() 在你的服务器调用 accept() 之前到达你的服务器? 不,我只希望一个客户端连接到服务器。我只是从服务器示例中提取了 10 个。 顺便问一下,您确定要使用 UDP 连接套接字吗?这是非常不寻常的。通常你只需使用bind 将套接字绑定到本地地址和端口,然后直接在套接字上使用recvfrom 您不能在 UDP 套接字上监听()或接受()。你的代码是废话。 是的,我想要一个 UDP 套接字。所以我只在服务器和客户端使用bind()、recvfrom()和sendto()? 【参考方案1】:

你的问题是你使用了错误的函数来打印错误。在 Windows 上,socket 函数没有设置errno,所以不能使用perror 函数。

您必须使用WSAGetLastError 来获取错误代码。这就是为什么您的错误消息没有任何意义。


在其他情况下,您可能应该使用WSAGetLastError。例如,bind 也可能因为其他原因而失败。

【讨论】:

我收到错误代码 10045:不支持操作。我真的不知道,我应该用它做什么。 @user2323546 似乎 Windows 强制 UDP 套接字的非连接性。您根本不能使用 UDP 套接字是被动(侦听)模式。请参阅我对您的问题的评论,了解它通常是如何完成的。

以上是关于套接字:listen()函数中的结果太大[关闭]的主要内容,如果未能解决你的问题,请参考以下文章

TCP状态查看以及故障的排查

listen函数

Linux 中的优雅关闭服务器套接字

listen 函数中参数 backlog

listen()函数

TCP 套接字关闭但未被进程检测到