Автор работы: Пользователь скрыл имя, 24 Сентября 2011 в 11:14, лабораторная работа
Цель работы:
Изучить методы создания серверов, используя алгоритм последовательной обработки запросов.
Лабораторная работа №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;
}