Создание последовательного сервера с установлением логического соединения (TCP/IP)

Автор работы: Пользователь скрыл имя, 24 Сентября 2011 в 11:14, лабораторная работа

Краткое описание

Цель работы:

Изучить методы создания серверов, используя алгоритм последовательной обработки запросов.

Содержимое работы - 1 файл

lab.doc

— 34.00 Кб (Скачать файл)
 

Лабораторная  работа №1

  Создание последовательного сервера с установлением логического соединения (TCP/IP) 

Цель  работы:

Изучить методы создания серверов, используя  алгоритм последовательной обработки  запросов. 

Ход работы:

Индивидуальное  задание:

      Осуществить взаимодействие клиента и сервера на основе протокола TCP/IP. Функционирование клиента и сервера реализовать следующим образом: сервер генерирует прогноз погоды на месяц. Клиент посылает день месяца и получает соответствующий прогноз. 

Серверная часть:

#include <sys/socket.h>

#include <netinet/in.h>

#include <unistd.h>

#include <fcntl.h>

#include <arpa/inet.h> 

#include <string.h>

#include <stdio.h>

#include <stdlib.h>

#include <iostream>

#include <iomanip> 

using namespace std; 

int main(int argc, char *argv[]) {

    int sock, sock2;

    char buff[100];

    int len;

    struct sockaddr_in host; 
 

    int day, weather[31];

    char tmp[5];

    for (int i = 0; i < 31; ++i)

        weather[i] = rand() % 10 - rand() % 10 + 20; 

    sock = socket(PF_INET, SOCK_STREAM, IPPROTO_TCP); 

    host.sin_family = AF_INET;

    host.sin_port = htons(31336); 

    host.sin_addr.s_addr = inet_addr("127.0.0.1");

    len = sizeof (host); 

    bind(sock, (struct sockaddr*) &host, sizeof (host));

    listen(sock, 2); 

    cout << "Server's IP:" << setw(20) << inet_ntoa(host.sin_addr) << endl;

    cout << "Server's socket descriptor:" << setw(5) << sock << endl; 

    while (true) {

        sock2 = accept(sock, (struct sockaddr*) &host, (socklen_t *) & len);

        cout << "Connection established!\nSocket descriptor:" << setw(14) << sock2 << endl;

        cout << "Port:" << setw(27) << ntohs(host.sin_port) << endl; 

        while (true || (strcmp(buff, "end") != 0)) {

            recv(sock2, buff, sizeof (buff), 0);

            if (!strcmp(buff, "end")) break;

            day = atoi(buff);

            if ((day <= 0) || (day >= 32)) {

                strcpy(buff, "Enter a correct day number!");

                cout << "Invalid day number!" << endl;

            } else {

                sprintf(tmp, "%d", weather[day - 1]);

                cout << "Day number is " << day << ". Temperature is +" << tmp << endl;

                strcpy(buff, "Temperature is +");

                strcat(buff, tmp);

            }

            send(sock2, buff, sizeof (buff), 0);

        } 

        close(sock2);

        cout << "Connection closed!" << endl;

        buff[0] = '\0';

    } 

    close(sock);

    return 0;

} 

Клиентская часть:

#include <sys/socket.h>

#include <netinet/in.h>

#include <unistd.h>

#include <fcntl.h>

#include <arpa/inet.h> 

#include <string.h>

#include <cstdio>

#include <cstdlib>

#include <iostream>

#include <iomanip> 

using namespace std; 

int main() {

    int sock;

    char buff[100];

    struct sockaddr_in host; 

    host.sin_family = AF_INET;

    host.sin_port = htons(31336);

    host.sin_addr.s_addr = inet_addr("127.0.0.1"); 

    sock = socket(PF_INET, SOCK_STREAM, IPPROTO_TCP); 

    if (connect(sock, (struct sockaddr*) &host, sizeof (host)) == -1) {

        cout << "Connection ERROR!!!\n";

        close(sock);

        exit(1);

    }

    else {

        cout << "Connection established!" << endl;

        cout << "Port:" << setw(23) << ntohs(host.sin_port) << endl;

        cout << "Server's IP:" << setw(16) << inet_ntoa(host.sin_addr) << endl;

        cout << "Socket descriptor:" << setw (10) << sock << endl;

    } 

    while (strcmp(buff,"end")!=0) {

        cout << "Enter a day number (from 1 to 31) or enter end to close connection\n >> ";

        fflush(stdin);

        gets(buff); 

        send(sock, buff, sizeof (buff), 0);

        recv(sock, buff, sizeof (buff), 0);

       

        if (strcmp(buff, "end")!=0)

            cout << buff << endl;

    } 

    cout << "Connection closed!\n";

    close(sock); 

    return 0;

}

Информация о работе Создание последовательного сервера с установлением логического соединения (TCP/IP)