Search
  • Dheeraj Jha

Socket Programming: Where is my server?

Welcome Folks...

If you want to achieve something, start working on that. In the beginning, it may look/feel silly and slow as tortoise speed but that steady tortoise speed will take you to your goal.


Let's not waste our time and start.

Socket:

The socket is a way to communicate between two processes on the same or different machines.

You can google for more information. There are tons of material. Let me know if you want it in my way. I will try to write simply.


Let's create a server which will open a socket and receive/send message to connected clients.

Create a Server: Server.cpp


We will start in main().

Let's create our socket with a function call socket().

int serverSocket = socket(AF_INET,SOCK_STREAM,0);

socket() function takes 3 arguments.

The first argument specifies a communication domain. This selects the protocol family which will be used for communication. These families are defined in <sys/socket.h>.

AF_INET is the address family if IPV4.

The second argument specifies the communication semantics. It can be

SOCK_STREAM - Provides sequenced, reliable, two-way, connection-based byte streams.

SOCK_DGRAM - Supports datagrams (connectionless, unreliable messages of a fixed maximum length).

The third argument specifies a particular protocol to be used with the socket. Normally only a single protocol exists to support a particular socket type within a given protocol family, in which case protocol can be specified as 0.


After creating a socket we need to create an object of sockaddr_in which is defined as a combination of an IP interface address and a 16-bit port number.

sockaddr_in serverSocketAdd;
serverSocketAdd.sin_family= AF_INET;
serverSocketAdd.sin_port= htons(PortNumber);
inet_pton(AF_INET, "0.0.0.0", &serverSocketAdd.sin_addr);

Here you provide a portnumber where the socket will be listening for any client message.

Once you populated serverSockAdd next step is to bind your socket with this address.


Hey, wait... What is this htons() and inet_ptons().


Do you know this? Let's check it out...

htons() - Host to Network Short

Many devices store numbers in little-endian format. The htons()function makes sure that numbers are stored in memory in network byte order, which is with the most significant byte first.

inet_pton() - The inet_pton() function converts an Internet address in its standard text format into its numeric binary form.


Now, let's bind our server socket to the port.

bind(serverSocket, (sockaddr*)&serverSocketAdd, sizeof(serverSocketAdd));

Once the bind() is successful, we will tell our socket to start listening.

listen(serverSocket, SOMAXCONN);

The first parameter is a serverSocket here and the second parameter defines how many numbers of client connections are accepted before start denying client connection. I mean to say maximum allowed client connection.

SOMAXCONN – Maximum queue length specified. By default is 128. If you want to increase the number of client connections. You will have to check this. Will see later in another article how to increase the allowed number of connections to more than 128.


Hurry... our socket is now listening on the specified port.


But wait, it is still not accepting connections from clients. To do this will call a function accept().

int clientSocket = accept(serverSocket, (sockaddr*)&clientSocketAdd, &clientSockerLen);

Accepts an incoming connection on a bound socket. The address information from the remote host is written into the clientSocketAdd structure and the actual size of the address structure is written into clientSocketLen. In other words, this accept() function will write the connecting client's address info into the address structure.