IRC connection over WebSockets keep freezing

Hello,

I am working on a simple IRC-client that lets me read the twitch chat via IRC using the synchronous version of the tungstenite-crate for websocekts. I ran into an issue where the program freezes up completely in irregular intervals (1h-2h). First suspected that the connection was terminated, but the program doesn't throw a panic.

use chrono::{Local, Timelike};
use std::net::TcpStream;
use std::thread;
use std::time::Duration;
use tungstenite::connect;
use tungstenite::stream::MaybeTlsStream;
use tungstenite::WebSocket;
use url::Url;

fn main() {
    irc_handler();
}

fn irc_handler() {
    loop {
        let mut wait_time = 1u64;
        print!("{}: appemt to connect\n", print_time());
        match connect(Url::parse("ws://irc-ws.chat.twitch.tv:80").unwrap()) {
            Ok(x) => {
                print!("{}: connected\n", print_time());
                // reset wait time
                wait_time = 1;
                irc(x.0)
            }
            Err(_) => {
                // double the sleep time before reconnecting again
                wait_time *= 2;
            }
        };
        thread::sleep(Duration::from_secs(wait_time));
    }
}

fn irc(mut socket: WebSocket<MaybeTlsStream<TcpStream>>) {
    // join as anon user
    socket
        .write_message(tungstenite::Message::Text("NICK justinfan12345\r\n".into()))
        .unwrap();

    // join a channel
    socket
        .write_message(tungstenite::Message::Text("JOIN #forsen\r\n".into()))
        .unwrap();
    socket.write_pending().unwrap();

    loop {
        match socket.read_message() {
            Ok(recv) => {
                // multiple twitch-messages in one irc-message
                for msg in recv.to_text().unwrap().split("\r\n") {
                    if msg.trim().is_empty() {
                        continue;
                    }

                    if msg == "PING :tmi.twitch.tv" {
                        socket
                            .write_message(tungstenite::Message::Text(
                                "PONG :tmi.twitch.tv\r\n".into(),
                            ))
                            .unwrap();
                        socket.write_pending().unwrap();
                        print!("{}: PING PONG\n", print_time());
                        continue;
                    }
                    print!("{} msg: {}\n", print_time(), msg);
                }
            }
            Err(e) => {
                match e {
                    // TODO: handle error types
                    _ => {
                        print!("{:?}", e);
                    }
                }
            }
        }
    }
}

fn print_time() -> String {
    let date = Local::now();
    format!("{}:{}:{}", date.hour(), date.minute(), date.second())
}

At this point, i think i have flaws in my understanding of either the tungstenite-crate or the IRC-protocol.

I would greatly appreciate any assistance you can provide regarding this issue. Thank you in advance for your support!

This topic was automatically closed 90 days after the last reply. We invite you to open a new topic if you have further questions or comments.