#include <stdio.h> #include <stdlib.h> #include <string.h> #include <unistd.h> #include <pthread.h> #include <sys/types.h> #include <sys/socket.h> #include <netinet/in.h> #include <arpa/inet.h> int gClientSocket; int bServerResult; int bServerError; int main(int argc, char** argv) { if (argc < 3) { fprintf(stderr, "-USAGE- %s <ip> <port>\n", argv[0]); exit(EXIT_FAILURE); } char* ip = argv[1]; unsigned int port = atoi(argv[2]); char str[128], szResult[128]; struct sockaddr_in server; if ((gClientSocket = socket(AF_INET, SOCK_STREAM, 0)) == -1) { perror("socket()"); exit(EXIT_FAILURE); } memset(&server, 0, sizeof (struct sockaddr_in)); server.sin_family = AF_INET; server.sin_addr.s_addr = inet_addr(ip); server.sin_port = htons(port); if (connect(gClientSocket, (struct sockaddr*) &server, sizeof server) != -1) { printf("Connecting %s:%d...\n", inet_ntoa(server.sin_addr), htons(server.sin_port)); int bytes_read; int i; unsigned long int quantity = 0; char term; printf("Number of values to compute: "); if (scanf("%lu%c", &quantity, &term) != 2 || quantity < 0 || term != '\n') { printf("-ERROR- Enter a valid unsigned integer!\n"); close(gClientSocket); exit(EXIT_FAILURE); } quantity = htonl(quantity); if (send(gClientSocket, &quantity, sizeof (int), 0) == -1) { close(gClientSocket); perror("send()"); exit(EXIT_FAILURE); } quantity = ntohl(quantity); float fDummy; char term2; for (i = 0; i < quantity; i++) { printf("INPUT #%d: ", i + 1); scanf("%s", str); if (sscanf(str, "%f%c", &fDummy, &term2) != 1) { printf("-ERROR- Enter a valid number!"); close(gClientSocket); exit(EXIT_FAILURE); } if (send(gClientSocket, str, strlen(str) + 1, 0) == -1) { close(gClientSocket); perror("send()"); exit(EXIT_FAILURE); } bzero(str, sizeof str); } if ((bytes_read = recv(gClientSocket, szResult, sizeof szResult, 0) != -1)) { if (bytes_read == 0) { close(gClientSocket); printf("The server shutdown!\n"); exit(0); } printf("Result: %s\n", szResult); } else { close(gClientSocket); perror("recv()"); exit(0); } } return 0; }