How to use sockets in Linux

 

Linux sockets are a way to do inter-process communication (IPC), allowing processes to communicate with each other locally or over a network. They support several communication protocols, the most common being TCP and UDP.

Here’s a basic tutorial to get you started with Linux sockets using TCP, as it's the most widely used protocol for connection-oriented communications.

Prerequisites


- Basic understanding of C programming.
- A Linux environment to compile and run your code.

Step 1: Include Necessary Headers


First, include the necessary headers in your C program:


#include <stdio.h>      // Standard input/output definitions
#include <stdlib.h>     // Standard library
#include <string.h>     // String handling functions
#include <unistd.h>     // UNIX standard function definitions
#include <sys/socket.h> // Main sockets header
#include <netinet/in.h> // Internet address family

Step 2: Create a Socket


You'll need to create a socket using the `socket()` function. This function returns an integer that acts as a socket descriptor.


int sockfd = socket(AF_INET, SOCK_STREAM, 0);
if (sockfd < 0) {
   perror("ERROR opening socket");
   exit(1);
}

- AF_INET: Address family (IPv4).
- SOCK_STREAM: Socket type (TCP).
- 0: Protocol (default protocol for the chosen type, TCP in this case).

Step 3: Bind the Socket


Bind the socket to an address and port on your system using the `bind()` function.


struct sockaddr_in serv_addr;
memset(&serv_addr, 0, sizeof(serv_addr));
serv_addr.sin_family = AF_INET;
serv_addr.sin_addr.s_addr = INADDR_ANY; // Listen on any IP address
serv_addr.sin_port = htons(12345); // Port number
if (bind(sockfd, (struct sockaddr *)&serv_addr, sizeof(serv_addr)) < 0) {
   perror("ERROR on binding");
   exit(2);
}

Step 4: Listen for Connections


After binding, listen for incoming connections:


listen(sockfd, 5);

The `5` here specifies the maximum size of the queue for pending connections.

Step 5: Accept Connections


Accept a connection with the `accept()` function. This function will block the process until a client connects to the server.


struct sockaddr_in cli_addr;
socklen_t clilen = sizeof(cli_addr);
int newsockfd = accept(sockfd, (struct sockaddr *)&cli_addr, &clilen);
if (newsockfd < 0) {
   perror("ERROR on accept");
   exit(3);
}

Step 6: Read and Write to the Socket


Use read() and write() functions to receive and send data:


char buffer[256];
memset(buffer, 0, 256);
int n = read(newsockfd, buffer, 255);
if (n < 0) perror("ERROR reading from socket");
printf("Here is the message: %s\n", buffer);
n = write(newsockfd, "I got your message", 18);
if (n < 0) perror("ERROR writing to socket");

Step 7: Close the Socket


Finally, close the socket once you're done with it:


close(newsockfd);
close(sockfd);

Compiling and Running


To compile your C program, use gcc:


gcc -o server yourprogram.c
 

Run your server program:


./server
 

You'll need a client to connect to this server. You can write a similar program that uses `connect()` instead of `bind()` and `listen()`, or you can use tools like `telnet` or `nc` (netcat) to test your server.

This is a very basic introduction to sockets in Linux. Real-world applications may need to handle errors more gracefully, use non-blocking sockets or select/poll for handling multiple connections simultaneously.

 

📝 Article Author : SEMRADE Tarik
🏷️ Author position : Embedded Software Engineer
🔗 Author LinkedIn : LinkedIn profile

Comments