user5132418
user5132418

Reputation:

Bind failed : Bad file descriptor

I'm new to socket programming and here I'm trying to set up a simple server socket and listen on it. Here's my code.

 int server_socket, client_socket, sent;
    size_t len;
    struct sockaddr_in server, client;
    char msg[] = "Hello to the world of socket programming";
    server_socket == socket(AF_INET, SOCK_STREAM, 0);

    if(server_socket == -1){
        perror("Socket creation failed: ");
        exit(-1);
    }

    //define server
    server.sin_family = AF_INET;
    server.sin_port = htons(10000);
    server.sin_addr.s_addr = INADDR_ANY;
    memset(&server.sin_zero, '\0', 8);


    len = sizeof(struct sockaddr_in);

    if((bind(server_socket, (struct sockaddr*)&server, len)) == -1){
        perror("Bind failed: ");
        exit(-1);
    }

    if(listen(server_socket, 5) == -1){
        perror("Listen failed: ");
        exit(-1);
    }

    while(true){

        if((client_socket = accept(server_socket, (struct sockaddr *)&client, (socklen_t *)&len)) == -1){

            perror("Accept failed: ");
            exit(-1);
        }

        sent = send(client_socket, msg, strlen(msg), 0);

        printf("Sent %d byte to client: %s\n", sent, inet_ntoa(client.sin_addr));

        close(client_socket);

    }

I keep getting

Bind Failed : Bad file descriptor

However my file descriptor is exactly as per beej guide. Any help?

Upvotes: 1

Views: 4785

Answers (2)

dbush
dbush

Reputation: 223739

Here's your problem:

server_socket == socket(AF_INET, SOCK_STREAM, 0);

You're not assigning anything to server_socket. You're comparing it against the return value of socket. You need to do this:

server_socket = socket(AF_INET, SOCK_STREAM, 0);

Since you're listening on a TCP socket, you'll also want to do this:

int option=1;
setsockopt(sock,SOL_SOCKET,SO_REUSEADDR,(char *)&option,sizeof(option));

This will prevent the app from experiencing "Address already in use" errors if it is killed and restarted within a short period of time.

Upvotes: 4

Sander De Dycker
Sander De Dycker

Reputation: 16243

Looks like it's caused by a typo :

server_socket == socket(AF_INET, SOCK_STREAM, 0);

should be :

server_socket = socket(AF_INET, SOCK_STREAM, 0);

Upvotes: 1

Related Questions