从bind()收到的C++ errno 22

标签 c++ linux sockets raspberry-pi errno

编辑我是个白痴,问题是括号放错了,谢谢大家的帮助。

我正在尝试初始化套接字,但当我尝试绑定(bind)套接字时,我不断收到 errno 22。我已经阅读了无数的教程并搜索了套接字上的数据库,但我一生都无法弄清楚这一点。你们中有哪位专业人士愿意帮助新手吗?

我的问题似乎出在这段代码中:

if(bind(serverSock, (struct sockaddr*)(&serverAddr), sizeof(serverAddr) < 0))
        {
            printf("Error binding socket: %d\n", errno);
            return 1;
        }

没有实际的程序错误,但程序打印出 errno 被设置为 22 并返回 1。

这是我的代码:

#include "Server.h"
#include <stdio.h>
#include <string.h>
#include <sys/types.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <errno.h>

int serverSock, newSockFd, port; 
unsigned int clientAddrLen;

struct sockaddr_in serverAddr, clientAddr;

int Server::ServerStart(short int portno)
{
    port = portno;
    if(port < 10)
    {
        printf("Invalid port number\n");
        return 1;
    }
    printf("Port valid, creating new socket\n");

    serverSock = socket(AF_INET, SOCK_STREAM, 0);

    if(serverSock < 0)
    {
        printf("Error opening socket: %d\n", errno);
        return 1;
    }
    else
    {
        printf("Socket open\n");

        bzero((char *)(&serverAddr), sizeof(serverAddr));

        serverAddr.sin_port = htons(port);
        serverAddr.sin_addr.s_addr = htonl(INADDR_ANY);
        serverAddr.sin_family = AF_INET;

        printf("Binding socket\n");

        if(bind(serverSock, (struct sockaddr*)(&serverAddr), sizeof(serverAddr) < 0))
        {
            printf("Error binding socket: %d\n", errno);
            return 1;
        }
        else
        {
            printf("Socket bound, listening for new connection\n");

            listen(serverSock, 5);

            printf("New connection found\n");

            clientAddrLen = sizeof(clientAddr);
            newSockFd = accept(serverSock, (struct sockaddr*) &clientAddr, &clientAddrLen);
            if(newSockFd < 0)
            {
                printf("Error accepting connection: %d\n", errno);
                return 1;
            }
            else
            {
                printf("New Socket is: %d\n", newSockFd);
                return newSockFd;
            }
        }
    }
}

这是我的第一篇文章,所以我希望我做得正确,请随时指出我做错的地方或可以做得更好的地方(即使它与实际问题无关,我总是愿意学习) .

最佳答案

我相信您放错了右括号。

这里

if(bind(serverSock, (struct sockaddr*)(&serverAddr), sizeof(serverAddr) < 0))

您通过sizeof(serverAddr) < 0 (即 false 因此它转换为 0 )作为 bind 的最后一个参数所以它显然失败了。

应该是

if(bind(serverSock, (struct sockaddr*)(&serverAddr), sizeof(serverAddr)) < 0)

关于从bind()收到的C++ errno 22,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31094321/

相关文章:

c++ - 带有 ARM M1 的 Mac 上的 cmake 正在运行带有 x86_64 架构而不是 arm64 的链接器

linux - 如何使用 rm 命令删除 Linux 中的所有空文件,无论其目录如何

linux - 使用awk混合两个文件

linux - 守护进程 : closed stderr and accept(2)

c++ - CATIA:如何调用 CATCoPlyExplodeCmd

c++ - 如何将值发送到标准输出流并在另一个程序中访问这些值

c++ - STL::deque 的 insert(loc, val) - 在 deque 结束时与其他位置的行为不一致?

linux - 尝试将两个参数传递给被调用的脚本以进行模式搜索

c++ - 将 ZMQ 上下文传递给线程

java - 使用开放式套接字在 Tomcat 上进行并行部署?