I am having trouble binding my socket. when i compile this code:
#include <stdio.h>
#include <sys/socket.h>
#include <sys/types.h>
#include <netinet/in.h>
#include <stdlib.h>
#include <string.h>
int main(int argc, char *argv[])
{
if (argc != 2)
{
printf("Error. Please enter the right amount of arguments (2)");
exit(1);
}
int sock, port, clientlen, connection, readfd, writefd;
char buffer[255];
struct sockaddr_in server, clientaddr;
if (sock = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP) < 0)
{
printf("Socket was not made.");
exit(1);
}
bzero((char *) &server, sizeof(server));
port = atoi(argv[1]);
server.sin_family = AF_INET;
server.sin_addr.s_addr = INADDR_ANY;
server.sin_port = htons(port);
if ((bind(socket, (struct sockaddr *) &server, sizeof(server))) < 0)
{
printf("Could not bind socket to address\n");
exit(1);
}
listen(socket, 5);
clientlen = sizeof(clientaddr);
if (connection = accept(socket, (struct sockaddr *) &clientaddr, &clientlen) < 0)
{
printf("Could not accept connection");
exit(1);
}
if (readfd = read(connection, buffer, 255) < 0)
{
printf("Could not read from socket");
exit(1);
}
printf("!---THIS IS A TEST---! \n BUFFER: %s", buffer);
if (writefd = write(connection, buffer, 255) < 0)
{
printf("Could not write to socket");
exit(1);
}
return 0;
}
I get the errors:
a3server.c: In function ‘main’:
a3server.c:33:28: warning: passing argument 1 of ‘bind’ makes integer from pointer without a cast [enabled by default]
if ((bind(socket, (struct sockaddr *) &server, sizeof(server))) < 0)
^
In file included from a3server.c:2:0:
/usr/include/x86_64-linux-gnu/sys/socket.h:123:12: note: expected ‘int’ but argument is of type ‘int (*)(int, int, int)’
extern int bind (int __fd, __CONST_SOCKADDR_ARG __addr, socklen_t __len)
^
a3server.c:39:2: warning: passing argument 1 of ‘listen’ makes integer from pointer without a cast [enabled by default]
listen(socket, 5);
^
In file included from a3server.c:2:0:
/usr/include/x86_64-linux-gnu/sys/socket.h:233:12: note: expected ‘int’ but argument is of type ‘int (*)(int, int, int)’
extern int listen (int __fd, int __n) __THROW;
^
a3server.c:43:42: warning: passing argument 1 of ‘accept’ makes integer from pointer without a cast [enabled by default]
if (connection = accept(socket, (struct sockaddr *) &clientaddr, &clientlen) < 0)
^
In file included from a3server.c:2:0:
/usr/include/x86_64-linux-gnu/sys/socket.h:243:12: note: expected ‘int’ but argument is of type ‘int (*)(int, int, int)’
extern int accept (int __fd, __SOCKADDR_ARG __addr,
I followed this guide here:http://www.cs.rpi.edu/~moorthy/Courses/os98/Pgms/socket.html and I'm not quite sure where I went wrong.
Also, this is my command when compiling "gcc a3server.c -g -o server" if that has anything to do with it.
The 'socket' Variable you use in bind(), listen() and accept() is not defined. The file descriptor return by socket() was saved in the 'sock' variable. You have to replace those occurances of 'socket' with 'sock'.
The correct way to do this would be:
bind (sock, (struct sockaddr *) &server, sizeof (server))
...
listen (sock, 5);
...
accept (sock, ...