- Introduction to Sockets Programming in C using TCP/IP Professor. TCP sockets UDP sockets TCP ports UDP ports Descriptor. Example - Echo using stream socket Client 1.
- Learn socket programming in C on the linux platform. Other sockets like UDP. I actually want to implement a chat room using raw sockets in C.
- Readers of the first part of this tutorial were introduced to the basics of programming custom network tools using the.
Socket programming in C on Linux – tutorial. TCP/IP socket programming in CThis is a quick tutorial on socket programming in c language on a Linux system. The windows api to socket programming is called winsock and we shall go through it in another tutorial. Sockets are the . For example when you type www. Same with any chat client like gtalk or skype.
Any network communication goes through a socket. The socket api on linux is similar to bsd/unix sockets from which it has evolved. Although over time the api has become slightly different at few places.
And now the newer official standard is posix sockets api which is same as bsd sockets. This tutorial assumes that you have basic knowledge of C and pointers. You will need to have gcc compiler installed on your Linux system. An IDE along with gcc would be great. I would recommend geany as you can quickly edit and run single file programs in it without much configurations.
On ubuntu you can do a sudo apt- get install geany on the terminal. All along the tutorial there are code snippets to demonstrate some concepts. You can run those code snippets in geany rightaway and test the results to better understand the concepts. Create a socket. This first thing to do is create a socket. The socket function does this. Here is a code sample .
It opens the file and sends it back to the requesting client with UDP. IBM Champion program; Events. Technical topics; Linux; Technical library; Programming Linux sockets, Part 2: Using UDP.
The above code will create a socket with following properties. Address Family - AF. This type of socket is non- connection socket. In this tutorial we shall stick to SOCK.
So we need 2 things, ip address and port number to connect to. To connect to a remote server we need to do a couple of things.
First is to create a sockaddr. It contains the IP address in long format. Function inet. This is how you do it .
Here we used the ip address of google. A little later on we shall see how to find out the ip address of a given domain name. The last thing needed is the connect function. It needs a socket and a sockaddr structure to connect to. Here is a code sample. It creates a socket and then connects. If you run the program it should show Connected.
Try connecting to a port different from port 8. OK , so we are now connected. Lets do the next thing , sending some data to the remote server. Connections are present only in tcp sockets. The concept of . Connection means a reliable .
Think of this as a pipe which is not interfered by other data. Other sockets like UDP , ICMP , ARP dont have a concept of . These are non- connection based communication. Which means you keep sending or receiving packets from anybody and everybody. Send data over socket. Function send will simply send data.
It needs the socket descriptor , the data to send and its size. Here is a very simple example of sending some data to google. So lets do it. Note. When sending data to a socket you are basically writing data to that socket.
This is similar to writing data to a file. Hence you can also use the write function to send data to a socket. Later in this tutorial we shall use write function to send data.
Receive data on socket. Function recv is used to receive data on a socket.
In the following example we shall send the same message as the last example and receive a reply from the server. It looks something like Html, well IT IS html. Google. com replied with the content of the page we requested. Quite simple! Note. When receiving data on a socket , we are basically reading the data on the socket. This is similar to reading data from a file.
So we can also use the read function to read data on a socket. For example . read(socket. Need to include the unistd. Connect to remote server.
Receive a reply. Your web browser also does the same thing when you open www. This kind of socket activity represents a socket client. A client is an application that connects to a remote system to fetch or retrieve data. The other kind of socket application is called a socket server. A server is a system that uses sockets to receive incoming connections and provide them with data. It is just the opposite of Client. So www. google. com is a server and your web browser is a client.
Or more technically www. HTTP Server and your web browser is an HTTP client. Now its time to do some server tasks using sockets. But before we move ahead there are a few side topics that should be covered just incase you need them. Get ip address of hostname. When connecting to a remote host , it is necessary to have its IP address. Function gethostbyname is used for this purpose.
It takes the domain name as the parameter and returns a structure of type hostent. This structure has the ip information.
It is present in netdb. Lets have a look at this structure. Description of data base entry for a single host. So now lets have some code to use them. Then the ip address can be used to make a connection using a socket. Function inet. This is just the opposite of inet.
Used by connect , send , recv etc. Used by gethostbyname.
In the next part we shall look into creating servers using socket. Servers are the opposite of clients, that instead of connecting out to others, they wait for incoming connections. Socket server. OK now onto server things. Socket servers operate in the following manner.
Bind to a address(and port). Listen for incoming connections.
Accept connections. Read/Send. We have already learnt how to open a socket. So the next thing would be to bind it. Bind socket to a port. The bind function can be used to bind a socket to a particular . We bind a socket to a particular IP address and a certain port number. By doing this we ensure that all incoming data which is directed towards this port number is received by this application.
This makes it obvious that you cannot have 2 sockets bound to the same port. Listen for incoming connections on the socket. After binding a socket to a port the next thing we need to do is listen for connections.
For this we need to put the socket in listening mode. Function listen is used to put the socket in listening mode. Just add the following line after bind. Now comes the main part of accepting new connections. Accept connection. Function accept is used for this.
Here is the code. It should showbind done. Waiting for incoming connections.. So now this program is waiting for incoming connections on port 8.
Dont close this program , keep it running. Now a client can connect to it on this port. We shall use the telnet client for testing this. Open a terminal and type $ telnet localhost 8.
On the terminal you shall get. Trying 1. 27. 0. 0. Try the above process till you get it perfect. Get the ip address of the connected client. You can get the ip address of client and the port of connection by using the sockaddr.
It is very simple . This was not very productive. There are lots of things that can be done after an incoming connection is established.
Afterall the connection was established for the purpose of communication. So lets reply to the client. We can simply use the write function to write something to the socket of the incoming connection and the client should see it. Here is an example . But I have to go now, bye\n. And connect to this server using telnet from another terminal and you should see this : $ telnet localhost 8.
Trying 1. 27. 0. 0. But I have to go now, bye. Connection closed by foreign host. So the client(telnet) received a reply from server. We can see that the connection is closed immediately after that simply because the server program ends after accepting and sending reply. A server like www. It means that a server is supposed to be running all the time.
Afterall its a server meant to serve. So we need to keep our server RUNNING non- stop. The simplest way to do this is to put the accept in a loop so that it can receive incoming connections all the time. Live Server. So a live server will be alive for all time.
Lets code this up . But I have to go now, bye\n. Just the accept was put in a loop. Now run the program in 1 terminal , and open 3 other terminals.
From each of the 3 terminal do a telnet to the server port. Each of the telnet terminal would show : $ telnet localhost 8. Trying 1. 27. 0. 0. But I have to go now, bye. And the server terminal would showbind done.
Waiting for incoming connections.. Now close the server program.
All telnet terminals would show . But still there is not effective communication between the server and the client. The server program accepts connections in a loop and just send them a reply, after that it does nothing with them. Also it is not able to handle more than 1 connection at a time. So now its time to handle the connections , and handle multiple connections together. Handle multiple socket connections with threads. To handle every connection we need a separate handling code to run along with the main server accepting connections.
One way to achieve this is using threads. The main server program accepts a connection and creates a new thread to handle communication for the connection, and then the server goes back to accept more connections. On Linux threading can be done with the pthread (posix threads) library. It would be good to read some small tutorial about it if you dont know anything about it. However the usage is not very complicated.
We shall now use threads to create handlers for each connection the server accepts. And now I will assign a handler for you\n! I am your connection handler\n. Now the server will create a thread for each client connecting to it. The telnet terminals would show : $ telnet localhost 8. Trying 1. 27. 0. 0.
And now I will assign a handler for you. Hello I am your connection handler. Its my duty to communicate with you.
This one looks good , but the communication handler is also quite dumb. After the greeting it terminates. It should stay alive and keep communicating with the client. One way to do this is by making the connection handler wait for some message from a client as long as the client is connected. If the client disconnects , the connection handler ends. So the connection handler can be rewritten like this .
This will handle connection for each client. I am your connection handler\n. Here is how the telnet output might look$ telnet localhost 8.