Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

bind: Socket operation on non-socket

I writing a server and a client and keep getting 'bind: Socket operation on non-socket'.

I've researched the heck out of this, have other code that runs in another application and have exhausted 8 hours trying to find this bug.

The code is:

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);    
}

Also, prior to this, I memset the memory block with this function.

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);
}

Variables are declared in the header file of the class.

public:
    struct sockaddr_in myAddress, clientAddress;

    void buildTCPSocket(int newPort);

private:
    int port;
    int socket1, socket2;

    socklen_t clientAddressLength;

-- Edit the code should be a little more clear now. socket1 is initialized in getSocket().

I've seen where a bunch of guys have missed the parens in the if but I think I eliminated that error by declaring myAddressSize and bindReturnValue.

Any input is appreciated.
Thank you, Ted S

Ok, problem solved. Of course the problem is never where you are looking are you would have found it. Here is the corrected code. The problem was in a missing set of parens in the call to socket().

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

Thanks again!

like image 352
Ted Spradley Avatar asked Apr 09 '11 01:04

Ted Spradley


People also ask

What() socket operation on non socket?

The “Socket operation on a non-socket” error means that, for some reason, the Windows TCP-IP stack has been overloaded, and the socket channel (which is used for communicating with the Internet) has been shut down abruptly.

Why does socket bind fail?

If you're seeing a "TCP/UDP: Socket bind failed on local address" error message in the OpenVPN log, it means your VPN connection is configured to bind to a fixed local address and/or port number, and that this address/port number is unavailable.

What is Socket Error 10038 Citrix?

The flaw could allow someone to capture your credentials if he has access to the traffic between your client computer and the target. The above 10038 error occurs if one system is updated and the other system is not. Best to patch those remote terminals!


1 Answers

I can almost guarantee you that you're getting that error because you never initialized socket1.

Typically you have to do something like this:

 int socket1 = socket(AF_INET, SOCK_STREAM, 0);
 bind(socket1, ...);

I don't see any code anywhere in there for setting up socket1. This is what the error message is telling you, after all. socket1 isn't a socket, so it's failing.

Edit: As a follow up, this is one of the reasons why I try to avoid using the syntax

if ((foo = bar()) == ERROR)
{
   // handle me
}

And instead stick with:

void TCPSocket::getSocket()
{
        // Get an internet domain socket AF_INET
    socket1 = socket(AF_INET, SOCK_STREAM, 0);
    if (socket == -1)
    {
        perror("socket");
        exit(1);
    }    
}
like image 184
Mike Bailey Avatar answered Sep 21 '22 05:09

Mike Bailey