Reputation:
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
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
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