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

时间:2015-06-27 22:49:54

标签: c++ linux sockets raspberry-pi errno

编辑我是个白痴,问题是错误的括号,感谢帮助人员。

我正在尝试初始化一个套接字,但是当我尝试绑定套接字时,我继续使用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;
            }
        }
    }
}

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

2 个答案:

答案 0 :(得分:1)

我相信你放错了右括号。

下面

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

您将sizeof(serverAddr) < 0false传递给0作为bind的最后一个参数,因此显然会失败。

应该是

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

答案 1 :(得分:0)

您错过了括号。 即使关闭括号并出现错误,也可能传递了错误的sizeof(struct sockaddr)参数。

bind假设有3个参数,第三个参数的类型为 我见过那些已经超越价值的人 用sizeof(struct sockaddr *)代替sizeof(struct sockaddr)

注意:第三个参数应该是integer,而不是指向整数的指针