diff options
author | Your Name <admin@zero.net> | 2025-04-30 12:04:51 +0200 |
---|---|---|
committer | Your Name <admin@zero.net> | 2025-04-30 12:04:51 +0200 |
commit | 1b03746ea372291aab182173faa7ea4efe1b5c35 (patch) | |
tree | de2a82e86c3a59b9e183afb33ef963ca9c6a4c16 /clientbin.c | |
parent | 2fa1a0f5663ee76287010e2f24a12594931d049d (diff) |
added client code
Diffstat (limited to 'clientbin.c')
-rw-r--r-- | clientbin.c | 84 |
1 files changed, 84 insertions, 0 deletions
diff --git a/clientbin.c b/clientbin.c new file mode 100644 index 0000000..55bd6e2 --- /dev/null +++ b/clientbin.c @@ -0,0 +1,84 @@ +#include <stdio.h> +#include <stdlib.h> +#include <string.h> +#include <unistd.h> +#include <arpa/inet.h> +#include <pthread.h> +#include <limits.h> + +#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; +} |