|
SDTP 0.2
Simple Data Transfer Protocol
|
Implementacao do Servidor SDTP. More...
#include <stdio.h>#include <stdlib.h>#include <unistd.h>#include <string.h>#include <netinet/in.h>#include <sys/socket.h>#include <pthread.h>#include "sdtp.h"
Classes | |
| struct | socket_sdtp |
Macros | |
| #define | SDTP_WAIT_SYN 0x00 |
| Aguardando syn do 3-way handshake. | |
| #define | SDTP_WAIT_ACK 0x01 |
| Aguardando ack do 3-way handshake. | |
| #define | SDTP_ESTABLISHED 0x02 |
| Conexao estabelecida. | |
| #define | SDTP_CLOSED 0x03 |
| Conexao finalizada. | |
| #define | SDTP_ERROR_NONE 0x00 |
| Sem erro. | |
| #define | SDTP_ERROR_LOST_IN 0x01 |
| Perda de pacote na recepcao. | |
| #define | SDTP_ERROR_LOST_OUT 0x02 |
| Perda de pacote no envio. | |
| #define | SDTP_ERROR_SUM_IN 0x03 |
| Checksum errado no pacote recebido. | |
| #define | SDTP_ERROR_SUM_OUT 0x04 |
| Checksum errado no pacote enviado. | |
| #define | WINDOW() (rand() % MSS)+1 |
Functions | |
| struct socket_sdtp * | get_socket_sdtp (struct sockaddr_in *addr) |
| void | remove_socket_sdtp (struct socket_sdtp *s) |
| void | print_socket_list () |
| char | simerror () |
| void | corrupt (char *buf, int len) |
| int | handle_socket_sdtp (struct socket_sdtp *s, struct sdtphdr *p) |
| int | main (int argc, char *argv[]) |
Variables | |
| struct socket_sdtp * | head = NULL |
| int | numsockets = 0 |
| uint16_t | datasum = 0 |
| char | global_error |
Implementacao do Servidor SDTP.
| #define WINDOW | ( | ) | (rand() % MSS)+1 |
Define o calculo para geracao de um valor (nao nulo) para a janela
| void corrupt | ( | char * | buf, |
| int | len | ||
| ) |
Corrompe alguns bytes de buf, entre os bytes 0 e len passado
| buf | Ponteiro para a posicao inicial do buffer a ser corrompido |
| len | Tamanho em bytes do buffer a ser corrompido |
| struct socket_sdtp * get_socket_sdtp | ( | struct sockaddr_in * | addr | ) |
Retorna o ponteiro para um socket sdtp, de acordo com a tupla (ip, porta) recebida.
Se nao encontrar um socket sdtp para a tupla, cria um novo socket sdtp e o retorna.
| addr | Um ponteiro para os dados recebidos do cliente. |
| int handle_socket_sdtp | ( | struct socket_sdtp * | s, |
| struct sdtphdr * | p | ||
| ) |
Funcao responsavel por fazer o tratamento no pacote recebido.
main() | int main | ( | int | argc, |
| char * | argv[] | ||
| ) |
Funcao principal do servidor
Nesta ocorre o looping infinito do servidor:
| void print_socket_list | ( | ) |
Imprime a lista de conexoes (sockets) ativas
| void remove_socket_sdtp | ( | struct socket_sdtp * | s | ) |
Remove o socket SDTP ativo, liberando o seu espaco
Apos remover o socket SDTP, reorganiza a fila de conexoes ativas.
| s | Ponteiro para o socket que se deseja remover |
| char simerror | ( | ) |
Gerador de um erro aleatorio, para cada pacote recebido
O erro sera gerado conforme as probabilidades definidas para os Possiveis Erros Simulados.
Gera um erro simulado com as seguintes probabilidades (%)
Exemplo da estrategia de geracao do erro, retornando o indice do vetor de probabilidades, conforme seja encontrado o valor gerado:
0 70 80 85 90 99
[------------------------[---------[-------[-------[---------]
NONE LOSTin LOSTout SUMin SUMout
| uint16_t datasum = 0 |
Armazena o checksum dos dados do arquivo lorem_ipsum.txt
Este valor sera comparado ao final da transmissao do cliente, para verificar a validade dos dados enviados.
| char global_error |
Armazena o valor do erro simulado para cada recepcao de pacote
| struct socket_sdtp* head = NULL |
Ponteiro para o inicio da lista de conexoes (estruturas) ativas
| int numsockets = 0 |
Quantidade de sockets estabelecidos