0% found this document useful (0 votes)
3 views3 pages

EXPLANATION OF OPCLIENT

Download as docx, pdf, or txt
Download as docx, pdf, or txt
Download as docx, pdf, or txt
You are on page 1/ 3

stdio.h: Header file for standard input and output operations.

string.h: Header file for string manipulation functions.

stdlib.h: Header file for standard library functions, such as memory allocation and conversion functions.

unistd.h: Header file for POSIX operating system API.

arpa/inet.h: Header file that includes definitions for internet operations.

sys/socket.h: Header file for socket programming.

Following are the defined constants:

BUF_SIZE: A constant representing the size of the buffer used for sending and receiving data.

RLT_SIZE: A constant representing the size of the result (presumably the result of mathematical
operations).

OPSZ: A constant representing the size of the operand, which might be related to the size of data being
operated on.

void error_handling(char *message);: This is a function prototype declaration. It declares a function


named error_handling that takes a single parameter, a pointer to a character array (string), and returns
nothing (void). This function is likely intended to handle errors by displaying an error message.

int main(int argc, char *argv[]): This is the main function, which is the entry point of the program. It takes
two parameters: argc, an integer representing the number of command-line arguments passed to the
program, and argv, an array of strings containing the command-line arguments themselves.

int sock;: Declares an integer variable sock, presumably intended to hold a socket descriptor.

char opmsg[BUF_SIZE];: Declares a character array (string) named opmsg with a size of BUF_SIZE. This is
likely used to store some message or data.

int result, opnd_cnt, i;: Declares integer variables result, opnd_cnt, and i which may be used for various
purposes within the main function.

struct sockaddr_in serv_adr;: Declares a variable serv_adr of type struct sockaddr_in, which is a
structure used for handling internet addresses. This structure typically contains information about IP
address and port number.


if (argc != 3):

This condition checks if the number of command-line arguments passed to the program is not equal to 3.
argc represents the count of arguments passed, including the program name itself.

If there aren't exactly 3 arguments, it prints a usage message indicating how the program should be used
and exits with a status of 1, indicating an error.

 sock = socket (PF_INET, SOCK_STREAM, 0);:


This line creates a TCP socket using the socket() function. It specifies the address family (PF_INET for
IPv4), the socket type (SOCK_STREAM for TCP), and the protocol (usually 0 for default protocol).

 if (sock == -1):

This condition checks if the socket creation was successful. If the socket() call returns -1, it indicates an
error.

 memset(&serv_adr, 0, sizeof(serv_adr));:

This line initializes the serv_adr structure to zeros using memset(). serv_adr is a structure of type
sockaddr_in which holds the server address information.

 Setting up the server address structure:

serv_adr.sin_family = AF_INET;: Sets the address family to IPv4.

serv_adr.sin_addr.s_addr = inet_addr(argv[1]);: Sets the IP address by converting the string


representation of the IP address from the second command-line argument (argv[1]) to the appropriate
format.

serv_adr.sin_port = htons(atoi(argv[2]));: Sets the port number by converting the string representation of
the port from the third command-line argument (argv[2]) to an integer, and then converting it to
network byte order using htons().

 if (connect(sock, (struct sockaddr*)&serv_adr, sizeof(serv_adr)) == -1):

This line attempts to establish a connection to the server using the connect() function. It takes the socket
descriptor sock, the server address structure cast to struct sockaddr*, and the size of the structure.

If the connection fails, it calls error_handling() function to handle the error.

 else puts ("connected -----");:

If the connection is successful, it prints "connected".

 Reading operands from the user:

fputs("operand count : ", stdout);: Prints a prompt asking for the number of operands.

scanf("%d", &opnd_cnt);: Reads an integer representing the number of operands from the user.

It then reads opnd_cnt number of integers from the user and stores them in opmsg array. The first byte
of opmsg is used to store the operand count.


fgetc(stdin);: This reads a character from the standard input (usually the keyboard) and discards it. It
seems unnecessary and might be a remnant of debugging or an attempt to clear the input buffer.

 fputs("operator : ", stdout);: This line simply prints the string "operator : " to the standard output
(usually the console).
 scanf("%c", &opmsg[opnd_cnt*OPSZ +1]);: This line reads a single character from the standard input
and stores it in the opmsg array at the position indicated by opnd_cnt*OPSZ +1. This might be part of a
larger operation where opmsg is a character array.

 write(sock,opmsg,opnd_cnt*OPSZ +2);: This writes opnd_cnt*OPSZ +2 bytes from the opmsg array to
the socket sock. It sends the operation message to the server.

 read(sock,&result, RLT_SIZE);: This reads RLT_SIZE bytes from the socket sock into the variable result.
Presumably, this is the result of the operation sent by the server.

 printf("operation result : %d\n", result );: This line prints the result of the operation to the standard
output.

 close(sock);: This closes the socket sock, releasing the connection to the server.

 return 0;: This ends the program with a successful exit status.

fputs(message, stderr);: Prints the error message contained in the message variable to the standard
error stream.

fputc('\n', stderr);: Prints a newline character ('\n') to the standard error stream, ensuring that
subsequent output starts on a new line.

exit(1);: Exits the program with an exit status of 1. An exit status of 1 typically indicates that the program
encountered an error and did not execute successfully.

This function is useful for centralizing error handling in a program. Instead of scattering error messages
throughout the code, you can call this function whenever an error occurs, passing it a descriptive error
message. This helps improve code readability and maintainability.

You might also like