Jake Probst
5 years ago
2 changed files with 113 additions and 0 deletions
-
3Cargo.toml
-
110src/login/main.rs
@ -0,0 +1,110 @@ |
|||
use std::net::{TcpListener, SocketAddr, Ipv4Addr};
|
|||
use std::net;
|
|||
use std::thread;
|
|||
|
|||
use mio::{Events, Poll, Token, Ready, PollOpt};
|
|||
use rand::{Rng, RngCore};
|
|||
|
|||
use libpso::{PacketParseError, PSOPacket};
|
|||
use libpso::packet::login::*;
|
|||
use libpso::crypto::{CipherError, PSOCipher, NullCipher};
|
|||
use libpso::crypto::bb::PSOBBCipher;
|
|||
|
|||
use elseware::common::{send_packet, recv_packet, PacketNetworkError};
|
|||
use elseware::common::cipherkeys::{ELSEWHERE_PRIVATE_KEY, ELSEWHERE_PARRAY};
|
|||
|
|||
const LOGIN_PORT: u16 = 12000;
|
|||
const CHARACTER_PORT: u16 = 12001;
|
|||
|
|||
|
|||
struct Client {
|
|||
running: bool,
|
|||
socket: mio::tcp::TcpStream,
|
|||
cipher_in: Box<dyn PSOCipher>,
|
|||
cipher_out: Box<dyn PSOCipher>,
|
|||
}
|
|||
|
|||
impl Client {
|
|||
fn new(socket: net::TcpStream) -> Client {
|
|||
Client {
|
|||
running: true,
|
|||
socket: mio::tcp::TcpStream::from_stream(socket).expect("could not convert socket to nonblocking"),
|
|||
cipher_in: Box::new(NullCipher {}),
|
|||
cipher_out: Box::new(NullCipher {}),
|
|||
}
|
|||
}
|
|||
|
|||
fn send(&mut self, pkt: &dyn PSOPacket) {
|
|||
match send_packet(&mut self.socket, &mut *self.cipher_out, pkt) {
|
|||
Ok(_) => {
|
|||
println!("[login] send ({:?}): {:?}", self.socket, pkt);
|
|||
},
|
|||
Err(err) => {
|
|||
println!("[login] error sending packet to {:?}: {:?}", self.socket, err);
|
|||
self.running = false;
|
|||
}
|
|||
}
|
|||
}
|
|||
}
|
|||
|
|||
fn client_loop(mut client: Client) {
|
|||
let poll = mio::Poll::new().unwrap();
|
|||
poll.register(&client.socket, Token(0), Ready::readable(), PollOpt::edge()).unwrap();
|
|||
|
|||
let mut events = Events::with_capacity(1024);
|
|||
loop {
|
|||
poll.poll(&mut events, None).unwrap();
|
|||
|
|||
for event in &events{
|
|||
println!("event! {:?}", event);
|
|||
if event.token() == Token(0) {
|
|||
loop {
|
|||
let pkt = recv_packet(&mut client.socket, &mut *client.cipher_in);
|
|||
println!("{:?}", pkt);
|
|||
|
|||
match pkt {
|
|||
Ok(pkt) => {
|
|||
//handle_packet(&mut client, pkt).expect("could not handle packet");
|
|||
println!("[login] pkt: {:?}", pkt);
|
|||
},
|
|||
Err(err) => {
|
|||
println!("[login] error recv-ing packet with {:?}: {:?}", client.socket, err);
|
|||
break;
|
|||
}
|
|||
}
|
|||
}
|
|||
}
|
|||
}
|
|||
}
|
|||
}
|
|||
|
|||
fn new_client(socket: net::TcpStream) {
|
|||
let mut client = Client::new(socket);
|
|||
let mut rng = rand::thread_rng();
|
|||
|
|||
let mut server_key = [0u8; 48];
|
|||
let mut client_key = [0u8; 48];
|
|||
rng.fill(&mut server_key[..]);
|
|||
rng.fill(&mut client_key[..]);
|
|||
let welcome = LoginWelcome::new(server_key, client_key);
|
|||
client.send(&welcome);
|
|||
client.cipher_in = Box::new(PSOBBCipher::new(ELSEWHERE_PARRAY, ELSEWHERE_PRIVATE_KEY, client_key));
|
|||
client.cipher_out = Box::new(PSOBBCipher::new(ELSEWHERE_PARRAY, ELSEWHERE_PRIVATE_KEY, server_key));
|
|||
client_loop(client);
|
|||
}
|
|||
|
|||
fn main() {
|
|||
println!("[login] starting server");
|
|||
|
|||
let listener = TcpListener::bind(&SocketAddr::from((Ipv4Addr::new(0,0,0,0), LOGIN_PORT))).unwrap();
|
|||
|
|||
while let Ok((socket, addr)) = listener.accept() {
|
|||
thread::spawn(move || {
|
|||
println!("[login] accepted connection: {}", addr);
|
|||
new_client(socket);
|
|||
});
|
|||
}
|
|||
|
|||
|
|||
println!("[login] exiting...");
|
|||
}
|
Write
Preview
Loading…
Cancel
Save
Reference in new issue