bind:非套接字上的套接字操作

Ted*_*ley 5 c++ sockets linux serversocket

我写了一个服务器和一个客户端,并继续'绑定:非套接字上的套接字操作'.

我已经研究了这个问题,有其他代码在另一个应用程序中运行,并且已经耗尽了8个小时试图找到这个bug.

代码是:

void TCPSocket::buildTCPSocket(int port)
{
    initializeSocket1();
    getSocket();
    bindSocket();
    listenToSocket();
    acceptSocket();
         // now you can send() and recv() with the
        // connected client via socket connectedTCPSocket
}

void TCPSocket::getSocket()
{
        // Get an internet domain socket AF_INET
    if(socket1 = socket(AF_INET, SOCK_STREAM,0) == -1)
    {
        perror("socket");
        exit(1);
    }    
}


void TCPSocket::bindSocket()
{
  // Bind to a port on the host
    int myAddressSize = sizeof(myAddress);
    int bindReturnValue = bind(socket1, (struct sockaddr *) &myAddress, AddressSize);
    if (bindReturnValue == -1)
    {
        perror("bind");  // <== Error message generated here
        exit(1);
    }
    printf("Socket for TCP bound to port %d\n", port);    
}
Run Code Online (Sandbox Code Playgroud)

此外,在此之前,我使用此功能memset内存块.

void TCPSocket::initializeSocket1()
{
    // Fill tcpSocket struct with 0's

    memset(&myAddress, '\0', sizeof(myAddress));
    myAddress.sin_family = AF_INET;
    myAddress.sin_addr.s_addr = INADDR_ANY;
   // Conver PORT to big-endian if necessary
    myAddress.sin_port = htons(this->port);
}
Run Code Online (Sandbox Code Playgroud)

变量在类的头文件中声明.

public:
    struct sockaddr_in myAddress, clientAddress;

    void buildTCPSocket(int newPort);

private:
    int port;
    int socket1, socket2;

    socklen_t clientAddressLength;
Run Code Online (Sandbox Code Playgroud)

- 现在编辑代码应该更加清晰.socket1在getSocket()中初始化.

我已经看到一群人在if中错过了parens,但我认为我通过声明myAddressSize和bindReturnValue消除了这个错误.

任何输入都表示赞赏.
谢谢Ted S.

好的,问题解决了.当然,问题永远不会在你看到的地方找到它.这是更正后的代码.问题出在socket()调用中缺少一组parens.

void TCPSocket::getSocket()
{
        // Get an internet domain socket AF_INET
    if((socket1 = socket(AF_INET, SOCK_STREAM,0)) == -1)
    {
        perror("socket");
        exit(1);
    }    
}
Run Code Online (Sandbox Code Playgroud)

再次感谢!

Mik*_*ley 9

我几乎可以保证你得到了那个错误,因为你从未初始化socket1.

通常你必须做这样的事情:

 int socket1 = socket(AF_INET, SOCK_STREAM, 0);
 bind(socket1, ...);
Run Code Online (Sandbox Code Playgroud)

我在那里找不到任何设置socket1的代码.毕竟,这就是错误消息告诉你的内容.socket1不是套接字,所以它失败了.

编辑:作为后续,这是我试图避免使用语法的原因之一

if ((foo = bar()) == ERROR)
{
   // handle me
}
Run Code Online (Sandbox Code Playgroud)

相反坚持:

void TCPSocket::getSocket()
{
        // Get an internet domain socket AF_INET
    socket1 = socket(AF_INET, SOCK_STREAM, 0);
    if (socket == -1)
    {
        perror("socket");
        exit(1);
    }    
}
Run Code Online (Sandbox Code Playgroud)

  • 嗯,你是对的.在getSocket()中对if(socket1 = socket(AF_INET,SOCK_STREAM,0)== -1)的调用缺少一个paren集.我将在编辑上发布正确的代码以获得正确的格式.非常感谢你们所有人.Arrggghh.浪费的时间.干杯. (2认同)