GithubHelp home page GithubHelp logo

Comments (7)

Thomasdezeeuw avatar Thomasdezeeuw commented on July 27, 2024

Question 1: I found that the WINDOWS system handles the network offline (unplug the peer network cable), and it takes about 8 seconds for the program to detect it.

This is outside of the scope of socket2. Socket2 doesn't do anything to change this.

Problem 2: During the brute force test, connections are constantly established and closed (shutdown). Socket2 does not call the WSACleanup function, so the connection fails.

We use the standard library for WSAStartup, see

socket2/src/sys/windows.rs

Lines 218 to 227 in 1f70523

fn init() {
static INIT: Once = Once::new();
INIT.call_once(|| {
// Initialize winsock through the standard library by just creating a
// dummy socket. Whether this is successful or not we drop the result as
// libstd will be sure to have initialized winsock.
let _ = net::UdpSocket::bind("127.0.0.1:34254");
});
}
. In rust standard library: https://github.com/rust-lang/rust/blob/078eb1120a3f576598b976d9470701363f48fccc/library/std/src/sys/windows/net.rs#L36-L59

from socket2.

ChrisDenton avatar ChrisDenton commented on July 27, 2024

Is there a reason why WSAStartup isn't called directly? Being tied to the standard library's startup/shutdown seems less versatile and more hacky.

from socket2.

Thomasdezeeuw avatar Thomasdezeeuw commented on July 27, 2024

Is there a reason why WSAStartup isn't called directly? Being tied to the standard library's startup/shutdown seems less versatile and more hacky.

It's not really possible as standard library always calls the WSAStartup whenever a std::net type is used. Furthermore it will panic if the call to WSAStartup fails. So if socket2 would call WSAStartup itself any usage of a type in std::net would cause a panic.

from socket2.

ChrisDenton avatar ChrisDenton commented on July 27, 2024

WSAStartup can be successfully called multiple times. The std only panics if the call fails. Trivial example:

fn main() {
    init();
    init();
    init();
    println!("Succesfully initialized");
    unsafe {
        assert_eq!(WSACleanup(), 0);
        assert_eq!(WSACleanup(), 0);
        assert_eq!(WSACleanup(), 0);
    }
    println!("Successfully shutdown");
}

fn init() {
    unsafe {
        let mut data: WSADATA = std::mem::zeroed();
        let ret = WSAStartup(0x202, &mut data);
        assert_eq!(ret, 0);
    }
}

#[link(name="Ws2_32")]
extern "system" {
    fn WSAStartup(wversionrequested: u16, lpwsadata: *mut WSADATA) -> i32;
    fn WSACleanup() -> i32;
}
#[repr(C)]
#[allow(non_snake_case)]
pub struct WSADATA {
    pub wVersion: u16,
    pub wHighVersion: u16,
    pub iMaxSockets: u16,
    pub iMaxUdpDg: u16,
    pub lpVendorInfo: *const u8,
    pub szDescription: [u8; 257],
    pub szSystemStatus: [u8; 129],
}

from socket2.

Thomasdezeeuw avatar Thomasdezeeuw commented on July 27, 2024

WSAStartup can be successfully called multiple times. The std only panics if the call fails. Trivial example:

That certainly didn't use the be case. What Windows version are you using?

Some more background: tokio-rs/mio#1046, tokio-rs/mio#1029

from socket2.

ChrisDenton avatar ChrisDenton commented on July 27, 2024

I've not yet investigated those threads but it's documented behaviour so I'm surprised it didn't work.

An application can call WSAStartup more than once if it needs to obtain the WSADATA structure information more than once. On each such call, the application can specify any version number supported by the Winsock DLL...
An application must call the WSACleanup function for every successful time the WSAStartup function is called.

from socket2.

Thomasdezeeuw avatar Thomasdezeeuw commented on July 27, 2024

I've not yet investigated those threads but it's documented behaviour so I'm surprised it didn't work.

An application can call WSAStartup more than once if it needs to obtain the WSADATA structure information more than once. On each such call, the application can specify any version number supported by the Winsock DLL...
An application must call the WSACleanup function for every successful time the WSAStartup function is called.

This might have changed in later versions, I don't know, don't really keep track of it.

from socket2.

Related Issues (20)

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. 📊📈🎉

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google ❤️ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.