diff options
author | Your Name <admin@zero.net> | 2025-04-30 13:36:44 +0200 |
---|---|---|
committer | Your Name <admin@zero.net> | 2025-04-30 13:36:44 +0200 |
commit | 7883bb61c05c1935dcefb82a922c166aa4d9ccbc (patch) | |
tree | 52df334def07afbcabe0352a0b622d457baef321 /clientbin.c | |
parent | e7ef9b6eca7b7aca393e233655a246c0e686a649 (diff) |
Diffstat (limited to 'clientbin.c')
-rw-r--r-- | clientbin.c | 102 |
1 files changed, 52 insertions, 50 deletions
diff --git a/clientbin.c b/clientbin.c index 55bd6e2..e513ca7 100644 --- a/clientbin.c +++ b/clientbin.c @@ -2,83 +2,85 @@ #include <stdlib.h> #include <string.h> #include <unistd.h> +#include <pwd.h> +#include <limits.h> +#include <netinet/in.h> #include <arpa/inet.h> +#include <sys/socket.h> #include <pthread.h> -#include <limits.h> -#define SERVER_IP "127.0.0.1" -#define SERVER_PORT 6667 +#define PORT 6667 #define BUFFER_SIZE 512 -int sock; -pthread_t recv_thread; - -void *receive_handler(void *arg) { +void *receive_handler(void *sock_ptr) { + int sock = *(int *)sock_ptr; 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'; + int bytes_received; + + while ((bytes_received = recv(sock, buffer, BUFFER_SIZE - 1, 0)) > 0) { + buffer[bytes_received] = '\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); + return NULL; } int main() { + int sock; 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; + if (sock == -1) { + perror("Socket creation failed"); + exit(EXIT_FAILURE); } server_addr.sin_family = AF_INET; - server_addr.sin_port = htons(SERVER_PORT); - inet_pton(AF_INET, SERVER_IP, &server_addr.sin_addr); + server_addr.sin_port = htons(PORT); + server_addr.sin_addr.s_addr = inet_addr("127.0.0.1"); // or your server IP + + if (connect(sock, (struct sockaddr *)&server_addr, sizeof(server_addr)) == -1) { + perror("Connection failed"); + exit(EXIT_FAILURE); + } + + printf("Connected to chat server.\n"); + + // Build the nickname as ssh-username@hostname + char username[LOGIN_NAME_MAX]; + char hostname[HOST_NAME_MAX]; + char nickname[100]; - if (connect(sock, (struct sockaddr *)&server_addr, sizeof(server_addr)) < 0) { - perror("connect"); - return 1; + struct passwd *pw = getpwuid(getuid()); + if (pw) { + strncpy(username, pw->pw_name, sizeof(username)); + } else { + strncpy(username, "unknown", sizeof(username)); } + gethostname(hostname, sizeof(hostname)); + snprintf(nickname, sizeof(nickname), "%s@%s", username, hostname); + // 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; - } + char nick_cmd[150]; + snprintf(nick_cmd, sizeof(nick_cmd), "NICK %s\n", nickname); + send(sock, nick_cmd, strlen(nick_cmd), 0); + + snprintf(nick_cmd, sizeof(nick_cmd), "USER %s 0 * :%s\n", nickname, nickname); + send(sock, nick_cmd, strlen(nick_cmd), 0); + + // Start receiver thread + pthread_t recv_thread; + pthread_create(&recv_thread, NULL, receive_handler, &sock); + + // Main input loop + while (fgets(buffer, sizeof(buffer), stdin)) { send(sock, buffer, strlen(buffer), 0); } close(sock); return 0; } + |