1/**
2 * TCP Echo Client
3 *
4 * Connects to a TCP echo server and sends user input.
5 * Receives and displays the echoed response.
6 *
7 * Build: make
8 * Usage: ./tcp_echo_client [server_ip] [port]
9 * Default: 127.0.0.1:8080
10 */
11
12#include <stdio.h>
13#include <stdlib.h>
14#include <string.h>
15#include <unistd.h>
16#include <sys/socket.h>
17#include <netinet/in.h>
18#include <arpa/inet.h>
19
20#define DEFAULT_PORT 8080
21#define BUF_SIZE 1024
22
23int main(int argc, char *argv[]) {
24 const char *server_ip = (argc > 1) ? argv[1] : "127.0.0.1";
25 int port = (argc > 2) ? atoi(argv[2]) : DEFAULT_PORT;
26
27 /* Create socket */
28 int sock_fd = socket(AF_INET, SOCK_STREAM, 0);
29 if (sock_fd < 0) {
30 perror("socket");
31 exit(EXIT_FAILURE);
32 }
33
34 /* Connect */
35 struct sockaddr_in server_addr = {
36 .sin_family = AF_INET,
37 .sin_port = htons(port)
38 };
39
40 if (inet_pton(AF_INET, server_ip, &server_addr.sin_addr) <= 0) {
41 fprintf(stderr, "Invalid address: %s\n", server_ip);
42 close(sock_fd);
43 exit(EXIT_FAILURE);
44 }
45
46 if (connect(sock_fd, (struct sockaddr *)&server_addr,
47 sizeof(server_addr)) < 0) {
48 perror("connect");
49 close(sock_fd);
50 exit(EXIT_FAILURE);
51 }
52
53 printf("Connected to %s:%d\n", server_ip, port);
54 printf("Type messages (Ctrl+D to quit):\n");
55
56 char buffer[BUF_SIZE];
57 while (fgets(buffer, BUF_SIZE, stdin) != NULL) {
58 /* Send message */
59 ssize_t sent = send(sock_fd, buffer, strlen(buffer), 0);
60 if (sent < 0) {
61 perror("send");
62 break;
63 }
64
65 /* Receive echo */
66 ssize_t bytes = recv(sock_fd, buffer, BUF_SIZE - 1, 0);
67 if (bytes <= 0) {
68 printf("Server disconnected\n");
69 break;
70 }
71 buffer[bytes] = '\0';
72 printf("Echo: %s", buffer);
73 }
74
75 close(sock_fd);
76 printf("Disconnected\n");
77 return 0;
78}