login server init
This commit is contained in:
parent
8620396ab5
commit
b6a8e2f97e
@ -8,6 +8,9 @@ edition = "2018"
|
||||
name = "patch"
|
||||
path = "src/patch/main.rs"
|
||||
|
||||
[[bin]]
|
||||
name = "login"
|
||||
path = "src/login/main.rs"
|
||||
|
||||
[dependencies]
|
||||
futures-preview = "=0.3.0-alpha.16"
|
||||
|
110
src/login/main.rs
Normal file
110
src/login/main.rs
Normal file
@ -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...");
|
||||
}
|
Loading…
x
Reference in New Issue
Block a user