Π§ΠΈΡ‚Π°ΠΉΡ‚Π΅ ΠΊΠ½ΠΈΠ³ΠΈ ΠΎΠ½Π»Π°ΠΉΠ½ Π½Π° Bookidrom.ru! БСсплатныС ΠΊΠ½ΠΈΠ³ΠΈ Π² ΠΎΠ΄Π½ΠΎΠΌ ΠΊΠ»ΠΈΠΊΠ΅

Π§ΠΈΡ‚Π°Ρ‚ΡŒ ΠΎΠ½Π»Π°ΠΉΠ½ Β«ΠžΠΏΠ΅Ρ€Π°Ρ†ΠΈΠΎΠ½Π½Π°Ρ систСма UNIXΒ». Π‘Ρ‚Ρ€Π°Π½ΠΈΡ†Π° 131

Автор РобачСвский АндрСй ΠœΠΈΡ…Π°ΠΉΠ»ΠΎΠ²ΠΈΡ‡

НиТС ΠΏΡ€ΠΈΠ²Π΅Π΄Π΅Π½Ρ‹ тСксты ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌ сСрвСра ΠΈ ΠΊΠ»ΠΈΠ΅Π½Ρ‚Π°.

Π‘Π΅Ρ€Π²Π΅Ρ€

#include <sys/types.h>

#include <sys/socket.h>

#include <netinet/in.h>

#include <arpa/inet.h>

#include <stdio.h>

#include <fcntl.h>

#include <netdb.h>

/* НомСр ΠΏΠΎΡ€Ρ‚Π° сСрвСра, извСстный ΠΊΠ»ΠΈΠ΅Π½Ρ‚Π°ΠΌ */

#define PORTNUM 1500

main(argc, argv)

int argc;

char *argv[];

{

Β int s, ns;

Β int pid;

Β int nport;

Β struct sockaddr_in serv_addr, clnt_addr;

Β struct hostent* hp;

Β char buf[80], hname[80];

Β /* ΠŸΡ€Π΅ΠΎΠ±Ρ€Π°Π·ΡƒΠ΅ΠΌ порядок слСдования Π±Π°ΠΉΡ‚ΠΎΠ²

Β Β Β  ΠΊ сСтСвому Ρ„ΠΎΡ€ΠΌΠ°Ρ‚Ρƒ */

Β nport = PORTNUM;

Β nport = htons((u_short)nport);

Β /* Π‘ΠΎΠ·Π΄Π°Π΄ΠΈΠΌ сокСт, ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΡŽΡ‰ΠΈΠΉ ΠΏΡ€ΠΎΡ‚ΠΎΠΊΠΎΠ» TCP */

Β if ((s=socket(AF_INET, SOCK_STREAM, 0))==-1) {

Β  perror("Ошибка Π²Ρ‹Π·ΠΎΠ²Π° socket()");

Β  exit(1);

Β }

Β /* Π—Π°Π΄Π°Π΄ΠΈΠΌ адрСс ΠΊΠΎΠΌΠΌΡƒΠ½ΠΈΠΊΠ°Ρ†ΠΈΠΎΠ½Π½ΠΎΠ³ΠΎ ΡƒΠ·Π»Π° */

Β bzero(&serv_addr, sizeof(serv_addr));

Β serv_addr.sin_family = AF_INET;

Β serv_addr.sin_addr.s_addr = INADDR_ANY;

Β serv.addr.sin_port = nport;

Β /* БвяТСм сокСт с этим адрСсом */

Β if (bind(s, struct sockaddr*)&serv_addr,

Β  sizeof(serv_addr))==-1) {

Β  perror("Ошибка Π²Ρ‹Π·ΠΎΠ²Π° bind()");

Β  exit(1);

Β }

Β /* Π’Ρ‹Π²Π΅Π΄Π΅ΠΌ сообщСниС с ΡƒΠΊΠ°Π·Π°Π½ΠΈΠ΅ΠΌ адрСса сСрвСра */

Β fprintf(stderr, "Π‘Π΅Ρ€Π²Π΅Ρ€ Π³ΠΎΡ‚ΠΎΠ²: %s\n",

Β  inet_ntoa(serv_addr.sin_addr));

Β /* Π‘Π΅Ρ€Π²Π΅Ρ€ Π³ΠΎΡ‚ΠΎΠ² ΠΏΡ€ΠΈΠ½ΠΈΠΌΠ°Ρ‚ΡŒ запросы

Β Β Β  Π½Π° установлСниС соСдинСния.

Β Β Β  МаксимальноС число запросов, ΠΎΠΆΠΈΠ΄Π°ΡŽΡ‰ΠΈΡ… ΠΎΠ±Ρ€Π°Π±ΠΎΡ‚ΠΊΠΈ – 5.

Β Β Β  Как ΠΏΡ€Π°Π²ΠΈΠ»ΠΎ, этого числа достаточно, Ρ‡Ρ‚ΠΎΠ±Ρ‹ ΡƒΡΠΏΠ΅Ρ‚ΡŒ

Β Β Β  Π²Ρ‹ΠΏΠΎΠ»Π½ΠΈΡ‚ΡŒ accept(2) ΠΈ ΠΏΠΎΡ€ΠΎΠ΄ΠΈΡ‚ΡŒ Π΄ΠΎΡ‡Π΅Ρ€Π½ΠΈΠΉ процСсс */

Β if (listen(s, 5)==-1) {

Β  perror("Ошибка Π²Ρ‹Π·ΠΎΠ²Π° listen()");

Β  exit(1);

Β }

Β /* БСсконСчный Ρ†ΠΈΠΊΠ» получСния запросов ΠΈ ΠΈΡ… ΠΎΠ±Ρ€Π°Π±ΠΎΡ‚ΠΊΠΈ */

Β while (1) {

Β  int addrlen;

Β  bzero(&clnt_addr, sizeof(clnt_addr));

Β  addrlen = sizeof(clnt_addr);

Β  /* ΠŸΡ€ΠΈΠΌΠ΅ΠΌ запрос. Новый сокСт ns становится

Β Β Β Β  ΠΊΠΎΠΌΠΌΡƒΠ½ΠΈΠΊΠ°Ρ†ΠΈΠΎΠ½Π½Ρ‹ΠΌ ΡƒΠ·Π»ΠΎΠΌ созданного Π²ΠΈΡ€Ρ‚ΡƒΠ°Π»ΡŒΠ½ΠΎΠ³ΠΎ ΠΊΠ°Π½Π°Π»Π° */

Β  if ((ns=accept(s, (struct sockaddr*)&clnt_addr,

Β Β  &addrlen))==-1) {

Β Β  perror("Ошибка Π²Ρ‹Π·ΠΎΠ²Π° accept()");

Β Β  exit(1);

Β  }

Β  /* Π’Ρ‹Π²Π΅Π΄Π΅ΠΌ ΠΈΠ½Ρ„ΠΎΡ€ΠΌΠ°Ρ†ΠΈΡŽ ΠΎ ΠΊΠ»ΠΈΠ΅Π½Ρ‚Π΅ */

Β  fprintf(stderr, "ΠšΠ»ΠΈΠ΅Π½Ρ‚ = %s\n",

Β Β  inet_ntoa(clnt_addr.sin_addr));

Β  /* Π‘ΠΎΠ·Π΄Π°Π΄ΠΈΠΌ процСсс для Ρ€Π°Π±ΠΎΡ‚Ρ‹ с ΠΊΠ»ΠΈΠ΅Π½Ρ‚ΠΎΠΌ */

Β  if ((pid=fork())==-1) {

Β Β  perror("Ошибка Π²Ρ‹Π·ΠΎΠ²Π° fork()");

Β Β  exit(1);

Β  }

Β  if (pid==0) {

Β Β  int nbytes;

Β Β  int fout;

Β Β Β /* Π”ΠΎΡ‡Π΅Ρ€Π½ΠΈΠΉ процСсс: этот сокСт Π½Π°ΠΌ Π½Π΅ Π½ΡƒΠΆΠ΅Π½. Он

Β Β Β Β Β  ΠΏΠΎ-ΠΏΡ€Π΅ΠΆΠ½Π΅ΠΌΡƒ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ΡΡ для получСния запросов */

Β Β  close(s);

Β Β  /* ΠŸΠΎΠ»ΡƒΡ‡ΠΈΠΌ сообщСниС ΠΎΡ‚ ΠΊΠ»ΠΈΠ΅Π½Ρ‚Π° ΠΈ ΠΏΠ΅Ρ€Π΅Π΄Π°Π΄ΠΈΠΌ Π΅Π³ΠΎ ΠΎΠ±Ρ€Π°Ρ‚Π½ΠΎ */

Β Β  while ((nbytes = recv(ns, buf, sizeof(buf), 0)) !=0) {

Β Β Β  send(ns, buf, sizeof(buf), 0);

Β Β  }

Β Β  close(ns);

Β Β  exit(0);

Β  }

Β  /* Π ΠΎΠ΄ΠΈΡ‚Π΅Π»ΡŒΡΠΊΠΈΠΉ процСсс: этот сокСт Π½Π°ΠΌ Π½Π΅ Π½ΡƒΠΆΠ΅Π½. Он

Β Β Β Β  ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ΡΡ Π΄ΠΎΡ‡Π΅Ρ€Π½ΠΈΠΌ процСссом для ΠΎΠ±ΠΌΠ΅Π½Π° Π΄Π°Π½Π½Ρ‹ΠΌΠΈ */

Β  close(ns);

Β }

}

ΠšΠ»ΠΈΠ΅Π½Ρ‚

#include <sys/types.h>

#include <sys/socket.h>

#include <netinet/in.h>

#include <arpa/inet.h>

#include <stdio.h>

#include <fcntl.h>

#include <netdb.h>