separate main tests in differents files and added comparison in readme
This commit is contained in:
85
README.md
85
README.md
@@ -9,8 +9,8 @@
|
||||
- **socket :** creates an endpoint for communication and returns a file descriptor that refers to that endpoint
|
||||
- **listen :** marks a socket as a passive socket, that is, as a socket that will be used to accept incoming connection requests using accept()
|
||||
- **accept :** used with connection-based socket types. It extracts the first connection request on the queue of pending connections for the listening socket, creates a new connected socket, and returns a new file descriptor referring to that socket. The newly created socket is not in the listening state. The original socket is unaffected by this call
|
||||
- **send :** used to transmit a message to another socket. May be used only when the socket is in a connected state (so that the intended recipient is known). The only difference between send() and write() is the presence of flags. With a zero flags argument, send() is equivalent to write()
|
||||
- **recv :** used to receive messages from a socket. May be used to receive data on both connectionless and connection-oriented sockets. The only difference between recv() and read() is the presence of flags. With a zero flags argument, recv() is generally equivalent to read()
|
||||
- **send :** (~write) used to transmit a message to another socket. May be used only when the socket is in a connected state (so that the intended recipient is known). The only difference between send() and write() is the presence of flags. With a zero flags argument, send() is equivalent to write()
|
||||
- **recv :** (~read) used to receive messages from a socket. May be used to receive data on both connectionless and connection-oriented sockets. The only difference between recv() and read() is the presence of flags. With a zero flags argument, recv() is generally equivalent to read()
|
||||
- **bind :** associate a socket fd to a local address. When a socket is created with socket(), it exists in a name space (address family) but has no address assigned to it. It is normally necessary to assign a local address using bind() before a socket may receive connections (see accept())
|
||||
- **connect :** connects a socket fd to a remote address
|
||||
- **inet_addr :** converts the Internet host address cp from IPv4 numbers-and-dots notation into binary data in network byte order. Use of this function is problematic because in case of error it returns -1, wich is a valid address (255.255.255.255). Avoid its use in favor of inet_aton(), inet_pton(), or getaddrinfo()
|
||||
@@ -77,3 +77,84 @@
|
||||
- [bind() vs connect()](https://stackoverflow.com/questions/27014955/socket-connect-vs-bind)
|
||||
- [INADDR_ANY for bind](https://stackoverflow.com/questions/16508685/understanding-inaddr-any-for-socket-programming)
|
||||
|
||||
## code architecture
|
||||
|
||||
|
||||
```
|
||||
______
|
||||
sd = SOCKET() : create a listening socket descriptor
|
||||
__________
|
||||
SETSOCKOPT(sd) : allow socket descriptor to be reuseable
|
||||
_____
|
||||
IOCTL(sd) : set listening socket and all incoming socket to be non-blocking
|
||||
____
|
||||
BIND(port) : associate listening socket to a port
|
||||
______
|
||||
LISTEN(nb_queue) : queue the incoming connections to listening socket
|
||||
up to a chosen number
|
||||
____
|
||||
POLL(fds[]) : wait for event on files descriptors
|
||||
______
|
||||
SELECT(fds[]) : wait for event on files descriptors
|
||||
FD_SET() : add a fd to a set
|
||||
FD_CLR() : remove a fd from a set
|
||||
FD_ZERO() : clears a set
|
||||
FD_ISSET() : test to see if a fd is part of the set
|
||||
______
|
||||
new_sd = ACCEPT() : extract first connection request in queue of listening socket
|
||||
and creates a new socket that is connected
|
||||
____
|
||||
RECV(new_sd) : read data in socket created by accept()
|
||||
____
|
||||
SEND(new_sd) : write data in socket created by accept()
|
||||
_____
|
||||
CLOSE(new_sd) : close open file (here socket) descriptor
|
||||
|
||||
```
|
||||
|
||||
compare architectures :
|
||||
|
||||
```
|
||||
POLL SELECT
|
||||
______ ______ ______
|
||||
lstn_sd = SOCKET() | lstn_sd = SOCKET() | lstn_sd = SOCKET()
|
||||
| __________ | __________
|
||||
| SETSOCKOPT() | SETSOCKOPT()
|
||||
| _____ | _____
|
||||
| IOCTL() | IOCTL()
|
||||
____ | ____ | ____
|
||||
BIND(port) | BIND(port) | BIND(port)
|
||||
______ | ______ | ______
|
||||
LISTEN(nb_queue) | LISTEN(nb_queue) | LISTEN(nb_queue)
|
||||
| |
|
||||
| fds[1] = lstn_sd | FD_SET(lstn_fd)
|
||||
| |
|
||||
| | max_sd = lstn_sd
|
||||
| |
|
||||
loop | loop | loop
|
||||
. ____ | . ____ | . ______
|
||||
. POLL() | . POLL(fds[]) | . SELECT(fds[])
|
||||
. | . | .
|
||||
. | . loop through fds[] | . loop i++ < max_fd
|
||||
. | . . | . .
|
||||
. | . . POLLIN && lstn_sd ? | . . FD_ISSET(i) & lstn_fd ?
|
||||
. ______ | . . . ______ | . . . ______
|
||||
. ACCEPT() | . . . new_sd = ACCEPT() | . . . new_sd = ACCEPT()
|
||||
. | . . . | . . .
|
||||
. | . . . fds[] += new_sd | . . . FD_SET new_sd in fds[]
|
||||
. | . . | . . .
|
||||
. | . . | . . . max_sd = new_sd
|
||||
. | . . | . .
|
||||
. | . . POLLIN ? | . . FD_ISSET ?
|
||||
. ____ | . . . ____ | . . . ____
|
||||
. RECV() | . . . RECV() | . . . RECV()
|
||||
. ____ | . . . ____ | . . . ____
|
||||
. SEND() | . . . SEND() | . . . SEND()
|
||||
. | |
|
||||
. | loop through fds[] | loop through fds[]
|
||||
. _____ | . _____ | . _____
|
||||
. CLOSE(fds[]) | . CLOSE(fds[]) | . CLOSE(fds[])
|
||||
|
||||
|
||||
```
|
||||
|
||||
|
||||
Reference in New Issue
Block a user