Algorithms_in_C 1.0.0
Set of algorithms implemented in C.
Loading...
Searching...
No Matches
tcp_full_duplex_client.c File Reference

Client-side implementation of TCP Full Duplex Communication More...

#include <arpa/inet.h>
#include <netdb.h>
#include <netinet/in.h>
#include <stdint.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <sys/socket.h>
#include <sys/types.h>
#include <unistd.h>
Include dependency graph for tcp_full_duplex_client.c:

Macros

#define PORT   10000
 For the type in_addr_t and in_port_t For structures returned by the network database library - formatted internet addresses and port numbers For in_addr and sockaddr_in structures. More...
 

Functions

void error ()
 Utility function used to print an error message to stderr. More...
 
int main ()
 Main function. More...
 

Detailed Description

Client-side implementation of TCP Full Duplex Communication

Author
NVombat
See also
tcp_full_duplex_server.c

The algorithm is based on the simple TCP client and server model. However, instead of the server only sending and the client only receiving data, The server and client can both send and receive data simultaneously. This is implemented by using the fork function call so that in the server the child process can receive data and parent process can send data, and in the client the child process can send data and the parent process can receive data. It runs an infinite loop and can send and receive messages indefinitely until the user exits the loop. In this way, the Full Duplex Form of communication can be represented using the TCP server-client model & socket programming

Macro Definition Documentation

◆ PORT

#define PORT   10000

For the type in_addr_t and in_port_t For structures returned by the network database library - formatted internet addresses and port numbers For in_addr and sockaddr_in structures.

For specific bit size values of variables Variable types, several macros, and various functions for performing input and output Variable types, several macros, and various functions for performing general functions Various functions for manipulating arrays of characters For macro definitions related to the creation of sockets For definitions to allow for the porting of BSD programs For miscellaneous symbolic constants and types, and miscellaneous functions

Function Documentation

◆ error()

void error ( )

Utility function used to print an error message to stderr.

It prints str and an implementation-defined error message corresponding to the global variable errno.

Returns
void
40{
41 perror("Socket Creation Failed");
42 exit(EXIT_FAILURE);
43}

◆ main()

int main ( void  )

Main function.

Returns
0 on exit

Variable Declarations

< socket descriptors - Like file handles but for sockets

< character arrays to read and store string data for communication

< basic structures for all syscalls and functions that deal with internet addresses. Structures for handling internet addresses

The TCP socket is created using the socket function.

AF_INET (Family) - it is an address family that is used to designate the type of addresses that your socket can communicate with

SOCK_STREAM (Type) - Indicates TCP Connection - A stream socket provides for the bidirectional, reliable, sequenced, and unduplicated flow of data without record boundaries. Aside from the bidirectionality of data flow, a pair of connected stream sockets provides an interface nearly identical to pipes.

0 (Protocol) - Specifies a particular protocol to be used with the socket. Specifying a protocol of 0 causes socket() to use an unspecified default protocol appropriate for the requested socket type.

Server Address Information

The bzero() function erases the data in the n bytes of the memory starting at the location pointed to, by writing zeros (bytes containing '\0') to that area.

We bind the server_addr to the internet address and port number thus giving our socket an identity with an address and port where it can listen for connections

htons - The htons() function translates a short integer from host byte order to network byte order

htonl - The htonl() function translates a long integer from host byte order to network byte order

These functions are necessary so that the binding of address and port takes place with data in the correct format

Connects the client to the server address using the socket descriptor This enables the two to communicate and exchange data

Communication between client and server

The bzero() function erases the data in the n bytes of the memory starting at the location pointed to, by writing zeros (bytes containing '\0') to that area. The variables are emptied and then ready for use

The fork function call is used to create a child and parent process which run and execute code simultaneously

The child process is used to send data and after doing so sleeps for 5 seconds to wait for the parent to receive data

The parent process is used to receive data and after doing so sleeps for 5 seconds to wait for the child to send data

The server and client can communicate indefinitely till one of them exits the connection

Since the exchange of information between the server and client takes place simultaneously this represents FULL DUPLEX COMMUNICATION

Value of 0 is for child process

Parent Process

Close Socket

50{
51 /** Variable Declarations */
52 uint32_t
53 sockfd; ///< socket descriptors - Like file handles but for sockets
54 char sendbuff[1024],
55 recvbuff[1024]; ///< character arrays to read and store string data
56 /// for communication
57
58 struct sockaddr_in
59 server_addr; ///< basic structures for all syscalls and functions that
60 /// deal with internet addresses. Structures for handling
61 /// internet addresses
62
63 /**
64 * The TCP socket is created using the socket function.
65 *
66 * AF_INET (Family) - it is an address family that is used to designate the
67 * type of addresses that your socket can communicate with
68 *
69 * SOCK_STREAM (Type) - Indicates TCP Connection - A stream socket provides
70 * for the bidirectional, reliable, sequenced, and unduplicated flow of data
71 * without record boundaries. Aside from the bidirectionality of data flow,
72 * a pair of connected stream sockets provides an interface nearly identical
73 * to pipes.
74 *
75 * 0 (Protocol) - Specifies a particular protocol to be used with the
76 * socket. Specifying a protocol of 0 causes socket() to use an unspecified
77 * default protocol appropriate for the requested socket type.
78 */
79 if ((sockfd = socket(AF_INET, SOCK_STREAM, 0)) < 0)
80 {
81 error();
82 }
83
84 /**
85 * Server Address Information
86 *
87 * The bzero() function erases the data in the n bytes of the memory
88 * starting at the location pointed to, by writing zeros (bytes
89 * containing '\0') to that area.
90 *
91 * We bind the server_addr to the internet address and port number thus
92 * giving our socket an identity with an address and port where it can
93 * listen for connections
94 *
95 * htons - The htons() function translates a short integer from host byte
96 * order to network byte order
97 *
98 * htonl - The htonl() function translates a long integer from host byte
99 * order to network byte order
100 *
101 * These functions are necessary so that the binding of address and port
102 * takes place with data in the correct format
103 */
104 bzero(&server_addr, sizeof(server_addr));
105 server_addr.sin_family = AF_INET;
106 server_addr.sin_port = htons(PORT);
107 server_addr.sin_addr.s_addr = htonl(INADDR_ANY);
108
109 printf("Client is running...\n");
110
111 /**
112 * Connects the client to the server address using the socket descriptor
113 * This enables the two to communicate and exchange data
114 */
115 connect(sockfd, (struct sockaddr *)&server_addr, sizeof(server_addr));
116
117 printf("Client is connected...\n");
118
119 /**
120 * Communication between client and server
121 *
122 * The bzero() function erases the data in the n bytes of the memory
123 * starting at the location pointed to, by writing zeros (bytes
124 * containing '\0') to that area. The variables are emptied and then
125 * ready for use
126 *
127 * The fork function call is used to create a child and parent process
128 * which run and execute code simultaneously
129 *
130 * The child process is used to send data and after doing so
131 * sleeps for 5 seconds to wait for the parent to receive data
132 *
133 * The parent process is used to receive data and after doing so
134 * sleeps for 5 seconds to wait for the child to send data
135 *
136 * The server and client can communicate indefinitely till one of them
137 * exits the connection
138 *
139 * Since the exchange of information between the server and client takes
140 * place simultaneously this represents FULL DUPLEX COMMUNICATION
141 */
142 pid_t pid;
143 pid = fork();
144 if (pid == 0) /// Value of 0 is for child process
145 {
146 while (1)
147 {
148 bzero(&sendbuff, sizeof(sendbuff));
149 printf("\nType message here: ");
150 fgets(sendbuff, 1024, stdin);
151 send(sockfd, sendbuff, strlen(sendbuff) + 1, 0);
152 printf("\nMessage sent!\n");
153 sleep(5);
154 // break;
155 }
156 }
157 else /// Parent Process
158 {
159 while (1)
160 {
161 bzero(&recvbuff, sizeof(recvbuff));
162 recv(sockfd, recvbuff, sizeof(recvbuff), 0);
163 printf("\nSERVER: %s\n", recvbuff);
164 sleep(5);
165 // break;
166 }
167 }
168
169 /// Close Socket
170 close(sockfd);
171 printf("Client is offline...\n");
172 return 0;
173}
PID Controller.
Definition: pid.c:31
#define PORT
For the type in_addr_t and in_port_t For structures returned by the network database library - format...
Definition: tcp_full_duplex_client.c:31
void error()
Utility function used to print an error message to stderr.
Definition: tcp_full_duplex_client.c:39
Here is the call graph for this function: