mirror of
https://github.com/danbulant/Cosmos
synced 2026-05-19 20:39:01 +00:00
89 lines
3.6 KiB
Markdown
89 lines
3.6 KiB
Markdown
# Network
|
|
|
|
In this article we will discuss about Networking on Cosmos, how to use the Network Stack, send and received packets. For now, available protocols are **ARP**, **IPv4**, **UDP**, **ICMP**, **DHCP** and **DNS** but the team is also working on TCP. Note that Cosmos devkit must be installed for this article.
|
|
|
|
All protocols here don't necessary support every feature described by their RFC and may have some bugs or architecture issues, if you find bugs or something abnormal please [submit an issue](http://https://github.com/CosmosOS/Cosmos/issues/new/choose "repository") on our repository.
|
|
|
|
Each protocol has a Client class which can be used to receive and send data. If a Receive() method is blocking, the method will timeout after 5 seconds or use the value optionally set by parameter. Please note that all finished connections should be closed using Close().
|
|
|
|
Cosmos Network Stack won't use Classes and Functions that are under .NET Core. Everything described here will be under:
|
|
```csharp
|
|
using Cosmos.System.Network;
|
|
```
|
|
|
|
Before anything, a Network Configuration must be set (local machine IPv4 address, subnet mask and gateway). It can be manually set with IPConfig.Enable or dynamically set through a DHCP server. For DHCP, Cosmos will ask to the DHCP server (usually default gateway) for an address in your local network.
|
|
|
|
### Manually set IPv4 Config
|
|
```csharp
|
|
NetworkDevice nic = NetworkDevice.GetDeviceByName("eth0"); //get network device by name
|
|
IPConfig.Enable(nic, new Address(192, 168, 1, 69), new Address(255, 255, 255, 0), new Address(192, 168, 1, 254)); //enable IPv4 configuration
|
|
```
|
|
### Dynamically set IPv4 Config through DHCP
|
|
```csharp
|
|
using(var xClient = new DHCPClient())
|
|
{
|
|
/** Send a DHCP Discover packet **/
|
|
//This will automatically set the IP config after DHCP response
|
|
xClient.SendDiscoverPacket();
|
|
|
|
xClient.Close(); //don't forget to close!
|
|
}
|
|
```
|
|
|
|
## UDP
|
|
Before playing with packets, we have to create a client and call Connect() to specify the remote machine address. After that the client will be able to send or listen for data.
|
|
```csharp
|
|
using(var xClient = new UdpClient(4242))
|
|
{
|
|
xClient.Connect(new Address(192, 168, 1, 70), 4242);
|
|
|
|
/** Send data **/
|
|
xClient.Send(Encoding.ASCII.GetBytes(message));
|
|
|
|
/** Receive data **/
|
|
var endpoint = new EndPoint(Address.Zero, 0);
|
|
xClient.Receive(ref endpoint); //set endpoint to remote machine IP:port
|
|
xClient.NonBlockingReceive(ref endpoint); //retrieve receive buffer without waiting
|
|
|
|
xClient.Close();
|
|
}
|
|
```
|
|
|
|
## ICMP
|
|
For ICMP, we will only able to send an ICMP echo to a distant machine and wait for its response. If another machine sends us an ICMP echo, Cosmos will automatically handle the request and reply.
|
|
```csharp
|
|
using(var xClient = new ICMPClient())
|
|
{
|
|
xClient.Connect(new Address(192, 168, 1, 254));
|
|
|
|
/** Send ICMP Echo **/
|
|
xClient.SendEcho();
|
|
|
|
/** Receive ICMP Response **/
|
|
int time = xClient.Receive(ref endpoint); //return elapsed time / timeout if no response
|
|
|
|
xClient.Close();
|
|
}
|
|
|
|
```
|
|
## DNS
|
|
DNS can be used to get an IP address from a Domain Name string. For now DNS can only ask for one domain name at the same time.
|
|
```csharp
|
|
using(var xClient = new DnsClient())
|
|
{
|
|
xClient.Connect(new Address(192, 168, 1, 254)); //DNS Server address
|
|
|
|
/** Send DNS ask for a single domain name **/
|
|
xClient.SendAsk("github.com");
|
|
|
|
/** Receive DNS Response **/
|
|
Address destination = xClient.Receive(); //can set a timeout value
|
|
|
|
xClient.Close();
|
|
}
|
|
```
|
|
## Utils
|
|
## Get local IP
|
|
```csharp
|
|
Console.WriteLine(NetworkConfig.CurrentConfig.Value.IPAddress.ToString());
|
|
```
|