Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- /**Copyright (c) 2015 Mathias Buus, Marcello Missiroli & Remy Lebeau */
- #include <stdio.h>
- #include <stdlib.h>
- #include <winsock.h>
- #define BUFFER_SIZE 1024
- void on_error(char *s, int *errCode = NULL)
- {
- int err = (errCode) ? *errCode : WSAGetLastError();
- fprintf(stderr, "%s: %d\n", s, err);
- fflush(stderr);
- WSACleanup();
- exit(1);
- }
- int main(int argc, char *argv[])
- {
- WSADATA wsadata;
- SOCKET server_fd, client_fd;
- struct sockaddr_in server, client;
- int port = 6666, err;
- char buf[BUFFER_SIZE];
- /** Controllo linea di comando **/
- if (argc > 2 ) on_error("Uso: tcp_echo [porta]\n");
- if (argc == 2) port = atoi(argv[1]);/** Conversione numero **/
- /** Inizializzazione Winsock **/
- err = WSAStartup(MAKEWORD(2,2), &wsadata);
- if (err != 0)
- on_error("Errore in WSAStartup", &err);
- /** Inizializzazione socket **/
- server_fd = socket(AF_INET, SOCK_STREAM, 0);
- if (server_fd == INVALID_SOCKET)
- on_error("Non ho potuto creare il socket");
- /** Configurazione socket **/
- memset(&server, 0, sizeof(server)); /** Azzeramento **/
- server.sin_family = AF_INET; /** Famiglia **/
- server.sin_port = htons(port); /** Conversione numero **/
- server.sin_addr.s_addr = INADDR_ANY;/** Accetta qualsiasi IP **/
- /** bind & listen **/
- const BOOL opt_val = TRUE;
- setsockopt(server_fd, SOL_SOCKET, SO_REUSEADDR, (char*)&opt_val, sizeof(opt_val));
- err = bind(server_fd, (struct sockaddr *) &server, sizeof(server));
- if (err == SOCKET_ERROR)
- on_error("Non ho potuto fare il bind del socket");
- err = listen(server_fd, 1);
- if (err == SOCKET_ERROR)
- on_error("Non ho potuto mettermi in ascolto sul socket");
- printf("Server in ascolto sulla porta %d\n", port);
- while (1)
- {
- int client_len = sizeof(client);
- client_fd = accept(server_fd, (struct sockaddr *) &client, &client_len);
- if (client_fd == INVALID_SOCKET)
- on_error("Non riesco a stabilire una nuova connessione");
- bool continua= true;
- do
- {
- /** Leggi dati (read = numero di byte ricevuti) **/
- int read = recv(client_fd, buf, BUFFER_SIZE, 0);
- if (read == 0)
- break; /** Fine connessione **/
- if (read == SOCKET_ERROR)
- {
- err = WSAGetLastError();
- if ((err != WSAENOTCONN) && (err != WSAECONNABORTED) && (err == WSAECONNRESET))
- on_error("Errore nella lettura dal client", &err);
- break;
- }
- /** Trasmetti i dati ricevuti **/
- int sent = send(client_fd, buf, read, 0);
- if (sent == SOCKET_ERROR)
- {
- err = WSAGetLastError();
- if ((err != WSAENOTCONN) && (err != WSAECONNABORTED) && (err == WSAECONNRESET))
- on_error("Errore nella scrittura verso il client", &err);
- }
- }
- while (continua);
- closesocket(client_fd);
- }
- WSACleanup();
- return 0;
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement