TCP guarantees:
The server code initializes a socket, binds it to an IP and port, listens for incoming connections, and echoes received messages back to the client.
#include <stdio.h>
#include <netinet/in.h>
#include <netdb.h>
#define SERV_TCP_PORT 5035
int main(int argc, char **argv) {
int sockfd, newsockfd, clength;
struct sockaddr_in serv_addr, cli_addr;
char buffer[4096];
sockfd = socket(AF_INET, SOCK_STREAM, 0);
serv_addr.sin_family = AF_INET;
serv_addr.sin_addr.s_addr = INADDR_ANY;
serv_addr.sin_port = htons(SERV_TCP_PORT);
printf("\nStart");
bind(sockfd, (struct sockaddr *)&serv_addr, sizeof(serv_addr));
printf("\nListening...\n");
listen(sockfd, 5);
clength = sizeof(cli_addr);
newsockfd = accept(sockfd, (struct sockaddr *)&cli_addr, &clength);
printf("\nAccepted\n");
read(newsockfd, buffer, 4096);
printf("\nClient message: %s", buffer);
write(newsockfd, buffer, 4096);
printf("\n");
close(sockfd);
return 0;
}
The client code establishes a TCP connection to the server, sends a message, and receives an echoed message.
#include <stdio.h>
#include <sys/types.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <netdb.h>
#define SERV_TCP_PORT 5035
int main(int argc, char *argv[]) {
int sockfd;
struct sockaddr_in serv_addr;
struct hostent *server;
char buffer[4096];
sockfd = socket(AF_INET, SOCK_STREAM, 0);
serv_addr.sin_family = AF_INET;
serv_addr.sin_addr.s_addr = inet_addr("127.0.0.1");
serv_addr.sin_port = htons(SERV_TCP_PORT);
printf("\nReady for sending...");
connect(sockfd, (struct sockaddr *)&serv_addr, sizeof(serv_addr));
printf("\nEnter the message to send\n");
printf("\nClient: ");
fgets(buffer, 4096, stdin);
write(sockfd, buffer, 4096);
printf("Server echo: %s", buffer);
printf("\n");
close(sockfd);
return 0;
}
Start
Listening...
Accepted
Client message: Hello Server
Ready for sending...
Enter the message to send
Client: Hello Server
Server echo: Hello Server