#include #include #include #include #include #include #include #define SERVER_IP "127.0.0.1" #define SERVER_PORT 6667 #define BUFFER_SIZE 512 int sock; pthread_t recv_thread; void *receive_handler(void *arg) { char buffer[BUFFER_SIZE]; while (1) { ssize_t bytes = recv(sock, buffer, sizeof(buffer) - 1, 0); if (bytes <= 0) { puts("Disconnected from server."); close(sock); exit(0); } buffer[bytes] = '\0'; printf("%s", buffer); fflush(stdout); } return NULL; } void get_nickname(char *nickname, size_t size) { char *user = getlogin(); if (!user) user = getenv("USER"); char hostname[HOST_NAME_MAX + 1]; if (gethostname(hostname, sizeof(hostname)) != 0) { strncpy(hostname, "unknown", sizeof(hostname)); } snprintf(nickname, size, "%s@%s", user ? user : "user", hostname); } int main() { struct sockaddr_in server_addr; char buffer[BUFFER_SIZE]; char nickname[100]; get_nickname(nickname, sizeof(nickname)); sock = socket(AF_INET, SOCK_STREAM, 0); if (sock < 0) { perror("socket"); return 1; } server_addr.sin_family = AF_INET; server_addr.sin_port = htons(SERVER_PORT); inet_pton(AF_INET, SERVER_IP, &server_addr.sin_addr); if (connect(sock, (struct sockaddr *)&server_addr, sizeof(server_addr)) < 0) { perror("connect"); return 1; } // Send NICK and USER commands char init[BUFFER_SIZE]; snprintf(init, sizeof(init), "NICK %s\r\nUSER %s 0 * :realname\r\n", nickname, nickname); send(sock, init, strlen(init), 0); puts("Connected to chat server."); pthread_create(&recv_thread, NULL, receive_handler, NULL); while (1) { fgets(buffer, sizeof(buffer), stdin); if (strcmp(buffer, "/quit\n") == 0) { break; } send(sock, buffer, strlen(buffer), 0); } close(sock); return 0; }