Implementation of the NetServer entity in the net example

netserver.c

#include <netdb.h>

#include <netinet/in.h>

#include <stdio.h>

#include <stdlib.h>

#include <string.h>

#include <sys/select.h>

#include <sys/socket.h>

#include <sys/types.h>

#include <unistd.h>

#include <stdlib.h>

#define EXAMPLE_PORT 1103

#define MAX_PENDING_CONNECTIONS 10

int main(int argc, const char *argv[])

{

struct sockaddr_in stSockAddr;

/* Create socket to accept incoming connection requests. */

int serverSocketFD = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);

if(-1 == serverSocketFD)

{

perror("can not create socket");

return EXIT_FAILURE;

}

/* Create and initialize socket address structure. */

memset(&stSockAddr, 0, sizeof(stSockAddr));

stSockAddr.sin_family = AF_INET;

stSockAddr.sin_port = htons(EXAMPLE_PORT);

stSockAddr.sin_addr.s_addr = htonl(INADDR_ANY);

/* Bind socket with local protocol address. */

if(-1 == bind(serverSocketFD,(struct sockaddr *)&stSockAddr, sizeof(stSockAddr)))

{

perror("error bind failed");

close(serverSocketFD);

return EXIT_FAILURE;

}

/* Transfer socket to passive state for accepting incoming connection request. */

if(-1 == listen(serverSocketFD, MAX_PENDING_CONNECTIONS))

{

perror("error listen failed");

close(serverSocketFD);

return EXIT_FAILURE;

}

{

fd_set readset;

FD_ZERO(&readset);

FD_SET(serverSocketFD, &readset);

/* Wait for socket readiness to accept incoming connection request. */

if (select(serverSocketFD + 1, &readset, NULL, NULL, NULL) == 1)

{

/* Accept incoming connection request and get socket for handling it. */

int ConnectFD = accept(serverSocketFD, NULL, NULL);

if (ConnectFD == -1)

{

perror("error accept failed");

close(serverSocketFD);

return EXIT_FAILURE;

}

char buf[1024];

/* Read data from incoming connection. */

if (-1 == recv(ConnectFD, buf, sizeof(buf), 0))

{

perror("recv failed");

close(ConnectFD);

close(serverSocketFD);

return EXIT_FAILURE;

}

else

{

/* Print received data to standard out stream. */

fprintf(stdout, "Server received: %s", buf);

}

/* Close incoming connection. */

if (-1 == shutdown(ConnectFD, SHUT_RDWR))

{

perror("can not shutdown socket");

close(ConnectFD);

close(serverSocketFD);

return EXIT_FAILURE;

}

/* Close socket handling incoming connection. */

close(ConnectFD);

}

else

{

/* Close serverSocketFD if error. */

close(serverSocketFD);

return EXIT_FAILURE;

}

}

/* Flush internal buffer */

fflush(stdout);

/* Finish handling of incoming connection requests. */

shutdown(serverSocketFD, SHUT_RDWR);

close(serverSocketFD);

return EXIT_SUCCESS;

}

Page top