mirror of https://github.com/01-edu/public.git
You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
195 lines
5.8 KiB
195 lines
5.8 KiB
5 years ago
|
## net-cat
|
||
|
|
||
|
### Objectives
|
||
|
|
||
5 years ago
|
This project consists on recreating the **NetCat in a Server-Client Architecture** that can run in a server mode on a specified port listening for incoming connections, and it can be used in client mode, trying to connect to a specified port and transmitting information to the server.
|
||
5 years ago
|
|
||
5 years ago
|
- NetCat, `nc` system command, is a computer network utility for reading from and writing to network connections using TCP or UDP. It is used for anything involving TCP, UDP, or UNIX-domain sockets, it is able to open TCP connections, send UDP packages, listen on arbitrary TCP and UDP ports...
|
||
5 years ago
|
|
||
|
- To see more information about NetCat inspect the manual `man nc`.
|
||
|
|
||
5 years ago
|
Your project must work in a similar way that NetCat works, in other words, you must create a group chat. The project must have the following features :
|
||
5 years ago
|
|
||
5 years ago
|
- TCP connection between server and multiple clients (relation of 1 to many).
|
||
|
- A name requirement to the client.
|
||
|
- Control connections quantity.
|
||
5 years ago
|
- Clients must be able to send messages to the chat.
|
||
5 years ago
|
- Do not broadcast EMPTY messages from a client.
|
||
|
- Messages sent, must be identified by the time that was sent and the user name of who sent the message, example : `[2020-01-20 15:48:41][client.name]:[client.message]`
|
||
5 years ago
|
- If a Client joins the chat, all the previous messages sent to the chat must be uploaded to the new Client.
|
||
5 years ago
|
- If a Client connects to the server, the rest of the Clients must be informed by the server that the Client joined the group.
|
||
|
- If a Client exits the chat, the rest of the Clients must be informed by the server that the Client left.
|
||
|
- All Clients must receive the messages sent by other Clients.
|
||
|
- If a Client leaves the chat, the rest of the Clients must not disconnect.
|
||
5 years ago
|
- If there is no port specified, then set as default the port 8989. Otherwise, program must respond with usage message: `[USAGE]: ./TCPChat $port`
|
||
5 years ago
|
|
||
|
This project will help you learn about :
|
||
|
|
||
|
- Manipulation of structures.
|
||
|
- [Net-Cat](https://linuxize.com/post/netcat-nc-command-with-examples/)
|
||
|
- [TCP/UDP](https://www.privateinternetaccess.com/blog/2018/12/tcp-vs-udp-understanding-the-difference/)
|
||
|
- TCP/UDP connection
|
||
|
- TCP/UDP socket
|
||
|
- [Channels](https://tour.golang.org/concurrency/2)
|
||
|
- [Goroutines](https://tour.golang.org/concurrency/1)
|
||
5 years ago
|
- Mutexes
|
||
5 years ago
|
- IP and [ports](https://en.wikipedia.org/wiki/List_of_TCP_and_UDP_port_numbers)
|
||
|
|
||
|
### Instructions
|
||
|
|
||
5 years ago
|
- Your project must be written in **Go**
|
||
|
- Start TCP server, listen and accept connections
|
||
|
- Your project must have Go-routines
|
||
|
- Your project must have channels or Mutexes
|
||
|
- Maximum 10 connections
|
||
|
- The code must respect the [**good practices**](https://public.01-edu.org/subjects/good-practices.en)
|
||
|
- It is recommended that the code should present a **test file** for the server connection and the client connection
|
||
|
- You have to be able to handle the errors from server side and client side
|
||
|
|
||
|
### Allowed Packages
|
||
|
|
||
|
- io
|
||
|
- log
|
||
|
- os
|
||
|
- fmt
|
||
|
- net
|
||
|
- sync
|
||
|
- time
|
||
|
- bufio
|
||
|
- errors
|
||
|
- strings
|
||
|
- reflect
|
||
5 years ago
|
|
||
|
### Usage
|
||
|
|
||
5 years ago
|
```console
|
||
|
student$ go build
|
||
|
student$ ./TCPChat
|
||
5 years ago
|
Listening on the port :8989
|
||
5 years ago
|
student$ ./TCPChat 2525
|
||
|
Listening on the port :2525
|
||
|
student$ ./TCPChat 2525 localhost
|
||
|
[USAGE]: ./TCPChat $port
|
||
|
```
|
||
5 years ago
|
|
||
5 years ago
|
- You should answer the client with a linux logo and ask for their name, when connection is received
|
||
5 years ago
|
|
||
|
```console
|
||
5 years ago
|
student$ nc $IP $port
|
||
|
Welcome to TCP-Chat!
|
||
|
_nnnn_
|
||
|
dGGGGMMb
|
||
|
@p~qp~~qMb
|
||
|
M|@||@) M|
|
||
|
@,----.JM|
|
||
|
JS^\__/ qKL
|
||
|
dZP qKRb
|
||
|
dZP qKKb
|
||
|
fZP SMMb
|
||
|
HZM MMMM
|
||
|
FqM MMMM
|
||
|
__| ". |\dS"qML
|
||
|
| `. | `' \Zq
|
||
|
_) \.___.,| .'
|
||
|
\____ )MMMMMP| .'
|
||
|
`-' `--'
|
||
|
[ENTER YOUR NAME]:
|
||
5 years ago
|
```
|
||
|
|
||
5 years ago
|
- Accept connection with non-empty name
|
||
5 years ago
|
|
||
5 years ago
|
The client :
|
||
5 years ago
|
|
||
|
```console
|
||
5 years ago
|
student$ nc $IP $port
|
||
|
```
|
||
5 years ago
|
|
||
5 years ago
|
Server:
|
||
5 years ago
|
|
||
5 years ago
|
```console
|
||
|
student$ ./TCPChat 2525
|
||
|
Listening on the port :2525
|
||
|
```
|
||
5 years ago
|
|
||
5 years ago
|
Client1 (Yenlik):
|
||
5 years ago
|
|
||
5 years ago
|
```console
|
||
|
student$ nc localhost 2525
|
||
|
Welcome to TCP-Chat!
|
||
|
_nnnn_
|
||
|
dGGGGMMb
|
||
|
@p~qp~~qMb
|
||
|
M|@||@) M|
|
||
|
@,----.JM|
|
||
|
JS^\__/ qKL
|
||
|
dZP qKRb
|
||
|
dZP qKKb
|
||
|
fZP SMMb
|
||
|
HZM MMMM
|
||
|
FqM MMMM
|
||
|
__| ". |\dS"qML
|
||
|
| `. | `' \Zq
|
||
|
_) \.___.,| .'
|
||
|
\____ )MMMMMP| .'
|
||
|
`-' `--'
|
||
|
[ENTER YOUR NAME]: Yenlik
|
||
|
[2020-01-20 16:03:43][Yenlik]:hello
|
||
|
[2020-01-20 16:03:46][Yenlik]:How are you?
|
||
|
[2020-01-20 16:04:10][Yenlik]:
|
||
|
Lee has joined our chat...
|
||
|
[2020-01-20 16:04:15][Yenlik]:
|
||
|
[2020-01-20 16:04:32][Lee]:Hi everyone!
|
||
|
[2020-01-20 16:04:32][Yenlik]:
|
||
|
[2020-01-20 16:04:35][Lee]:How are you?
|
||
|
[2020-01-20 16:04:35][Yenlik]:great, and you?
|
||
|
[2020-01-20 16:04:41][Yenlik]:
|
||
|
[2020-01-20 16:04:44][Lee]:good!
|
||
|
[2020-01-20 16:04:44][Yenlik]:
|
||
|
[2020-01-20 16:04:50][Lee]:alright, see ya!
|
||
|
[2020-01-20 16:04:50][Yenlik]:bye-bye!
|
||
|
[2020-01-20 16:04:57][Yenlik]:
|
||
|
Lee has left our chat...
|
||
|
[2020-01-20 16:04:59][Yenlik]:
|
||
5 years ago
|
```
|
||
|
|
||
5 years ago
|
Client2 (Lee):
|
||
5 years ago
|
|
||
|
```console
|
||
5 years ago
|
student$ nc localhost 2525
|
||
|
Yenliks-MacBook-Air:simpleTCPChat ybokina$ nc localhost 2525
|
||
|
Yenliks-MacBook-Air:simpleTCPChat ybokina$ nc localhost 2525
|
||
|
Welcome to TCP-Chat!
|
||
|
_nnnn_
|
||
|
dGGGGMMb
|
||
|
@p~qp~~qMb
|
||
|
M|@||@) M|
|
||
|
@,----.JM|
|
||
|
JS^\__/ qKL
|
||
|
dZP qKRb
|
||
|
dZP qKKb
|
||
|
fZP SMMb
|
||
|
HZM MMMM
|
||
|
FqM MMMM
|
||
|
__| ". |\dS"qML
|
||
|
| `. | `' \Zq
|
||
|
_) \.___.,| .'
|
||
|
\____ )MMMMMP| .'
|
||
|
`-' `--'
|
||
|
[ENTER YOUR NAME]: Lee
|
||
|
[2020-01-20 16:04:15][Lee]:Hi everyone!
|
||
|
[2020-01-20 16:04:32][Lee]:How are you?
|
||
|
[2020-01-20 16:04:35][Lee]:
|
||
|
[2020-01-20 16:04:41][Yenlik]:great, and you?
|
||
|
[2020-01-20 16:04:41][Lee]:good!
|
||
|
[2020-01-20 16:04:44][Lee]:alright, see ya!
|
||
|
[2020-01-20 16:04:50][Lee]:
|
||
|
[2020-01-20 16:04:57][Yenlik]:bye-bye!
|
||
|
[2020-01-20 16:04:57][Lee]:^C
|
||
|
```
|
||
5 years ago
|
|
||
5 years ago
|
## Bonus
|
||
5 years ago
|
|
||
5 years ago
|
- Terminal UI (you are allowed to use only this package : https://github.com/jroimartin/gocui)
|
||
|
- Logging into the file
|
||
|
- Creating more than 1 group chat
|