TCP_serwer.c

/*
 * plik ma na celu prezentację ciekawych zagadnień z programowania w języku C / C++
 * prezentuje metody komunikacji sieciowej (TCP/IP) - prosty serwer TCP echo
 *
 * przykładowy klijent TCP zademonstrowany jest w jabber.cpp
 *
 */

#include <sys/socket.h>
#include <netinet/ip.h>

#include <stdio.h>
#include <stdlib.h>
#include <errno.h>
#include <inttypes.h>

#define BUF_SIZE 255
#define QUERY_SIZE 1
#define PORT 4080


char buf[BUF_SIZE];

int main(int argv, char *args[]) {
  int res;
  
  // gniazdo ...
  int sh = socket(PF_INET, SOCK_STREAM, 0);
  if (sh<0) {
    fprintf(stderr, "%s\n", strerror(errno));
    exit(EXIT_FAILURE);
  }

  // utworzenie struktury opisującej adres
  struct sockaddr_in serwer;
  serwer.sin_family=AF_INET;
  serwer.sin_port=htons(PORT);
    // host to network short (porzadek bajtow) ... sa tez dla long i odwrotne ...
  serwer.sin_addr.s_addr=INADDR_ANY;
    // INADDR_ANY oznacza że nasłuchujemy na każdym adresie IP danego hosta
    // (zamiast tego można określić konkretny adres)

  // przypisanie adresu ...
  if (bind(sh, (struct sockaddr *) &serwer, sizeof(struct sockaddr_in)) < 0) {
    fprintf(stderr, "%s\n", strerror(errno));
    exit(EXIT_FAILURE);
  }

  while(1) {
    // otwarcie portu do nasluchiwania
    if (listen(sh, QUERY_SIZE) < 0) {
      fprintf(stderr, "%s\n", strerror(errno));
      exit(EXIT_FAILURE);
    }
    
    // odebranie połączenia
    struct sockaddr_in from;
    socklen_t fromlen=sizeof(struct sockaddr_in);
    int sh2 = accept(sh, (struct sockaddr *) &from, &fromlen);
    
    // tutaj moglibysmy utworzyc potomka zajmujacego sie tym polaczeniem ...
    // wtedy w macierzystym robimy close(sh2) a w potomnym close(sh)
    
    // tu mozna sprawdzic czy klijent uprawniony jak nie to close(sh2)
    
    FILE * net;
    net=fdopen(sh2, "r+");
    while(fgets(buf, BUF_SIZE, net))
      fputs(buf, net);
    fclose(net);
  }

  // zamkniecie gniazda
  close(sh);
}

XHTML generated by highlight (http://www.andre-simon.de/) from TCP_serwer.c



Copyright (c) 1999-2015, Robert Paciorek (http://www.opcode.eu.org/), BSD/MIT-type license


Redystrybucja wersji źródłowych i wynikowych, po lub bez dokonywania modyfikacji JEST DOZWOLONA, pod warunkiem zachowania niniejszej informacji o prawach autorskich. Autor NIE ponosi JAKIEJKOLWIEK odpowiedzialności za skutki użytkowania tego dokumentu/programu oraz za wykorzystanie zawartych tu informacji.

This text/program is free document/software. Redistribution and use in source and binary forms, with or without modification, ARE PERMITTED provided save this copyright notice. This document/program is distributed WITHOUT any warranty, use at YOUR own risk.

Valid XHTML 1.1 Dokument ten (URL: http://www.opcode.eu.org/programing/c_cpp/TCP_serwer.c) należy do serwisu OpCode. Autorem tej strony jest Robert Paciorek, wszelkie uwagi proszę kierować na adres e-mail serwisu: webmaster@opcode.eu.org.
Data ostatniej modyfikacji artykulu: '2014-01-07 19:27:41 (UTC)' (data ta może być zafałszowana niemerytorycznymi modyfikacjami artykułu).