LINUX.ORG.RU

Задание тестовое по сям

 


2

1

Есть вот такое задание:

Тестовое задание №2

Разработать консольное серверное приложение работающее в среде ОС LINUX на пользовательском уровне. Приложение должно 
генерировать последовательность целых чисел, состоящую из 3-х
 подпоследовательностей, каждая из которых представляет собой 
целочисленный неотрицательный 64-х битный счетчик. Для каждой 
такой подпоследовательности начальное значение и шаг между двумя
 соседними значениями задается пользователем произвольно. 

Формат задания параметров – простой текст в tcp/ip сокет (для проверки используется telnet-клиент). 
  
Перечень команд 
  
1.	seq1 xxxx yyyy (задать начальное значение = xxxx и шаг = yyyy для первой подпоследовательности); 
2.	seq2 xxxx yyyy (задать начальное значение = xxxx и шаг = yyyy для второй подпоследовательности); 
3.	seq3 xxxx yyyy (задать начальное значение = xxxx и шаг = yyyy для третьей подпоследовательности); 
4.	export seq - выдавать в сокет каждому клиенту сгенерированную последовательность. 
  
Примечания 
  
1.	Если в командах 1, 2, 3 любой из параметров (начальное значение и/или шаг) будет указан как = 0, 
то программа не должна учитывать данную подпоследовательность; 
2.	При переполнении счетчика подпоследовательность должна начинаться сначала; 
3.	Формат передаваемых по сети данных – 64-х битные целые числа (binary data); 
4.	Программа не должна аварийно завершать работу в случаях некорректно введенных параметров, 
аварийного завершения работы клиента и т.д; 
5.	Язык для разработки – C, компилятор GCC, в проекте должен присутствовать Makefile; 
6.	Для создания/управления потоками, списками, примитивами синхронизации и т. п. можно использовать сторонние библиотеки. 
  
Примеры входных и выходных данных 
  
1.	seq1 1 2 – задает подпоследовательность 1, 3, 5 и т.д; 
2.	seq2 2 3 – задает подпоследовательность 2, 5, 8 и т.д; 
3.	seq3 3 4 – задает подпоследовательность 3, 7, 11 и т.д; 
4.	export seq – в сокет передается последовательность 1, 2, 3, 3, 5, 7, 5, 8, 11 и т.д. 


Мне вроде понятно все кроме проверки сокета телнетом? и вывода под номером 4


[i]Перемещено jollheef из general[/i]


Последнее исправление: Gremlin_ (всего исправлений: 3)

и тебе интересны такие задачи? иди игрушку свои игру допиливай лучше.

а что не понятно с телнетом? читай пришедшие данные из сокета, как если бы это был stdin

anonymous
()

Мне вроде понятно все кроме проверки сокета телнетом?

Подключаешься телнетом на порт, открытый твоей программой, отправляешь команды, программа отвечает этими последовательностями.

и вывода под номером 4

Ну 1 2 3 это когда начинаем с 1 и с шагом 1

3 5 7 это когда начинаем с 3 и с шагом 2

5 8 11 это когда начинаем с 5 и с шагом 3

если продолжать, то следующие три цифры должны быть 7 11 15 - начинаем с 7 и с шагом 4. и т.д.

SZT ★★★★★
()
Последнее исправление: SZT (всего исправлений: 1)
Ответ на: комментарий от SZT

начинаем с 1 и с шагом 1
seq1 1 2

Не так. Эти последовательности сливаются поэлементно: первый элемент первой последовательности, первый элемент второй, третей, второй элемент первой последовательности и т.д.

xaizek ★★★★★
()
Ответ на: комментарий от SZT

Нет, первые числа последовательностей 1, 2, 3, потом вторые числа последовательностей 1, 2, 3, и т.д.

bormant ★★★★★
()

Теми, кто умеет пользоваться telnet, xed и прочими прекрасными утилитами, для проверки используется telnet. Ну а ты вправе отлаживаться и проверять корректность работы, как знаешь видимо?

pon4ik ★★★★★
()

Хотя, если задуматься, упоминание о telnet'e даёт недостающую часть протокола, а именно - разделитель для команд...

pon4ik ★★★★★
()

Вот что сделал

#include <stdio.h>
#include <cstdint>
#include <malloc.h>
#include <stdlib.h>
#include <string.h>
int main(int argc,char* argv[])
{
	char *str=(char*)malloc(sizeof(char)*4);
	int64_t *masbegin = (int64_t *)malloc(sizeof(int64_t)*3);
	int64_t *masiter = (int64_t *)malloc(sizeof(int64_t)*3);
	int64_t begin,iter;
	const int n = 10;
	int64_t* seq1 = (int64_t *)malloc(sizeof(int64_t)*n);
	int64_t* seq2 = (int64_t *)malloc(sizeof(int64_t)*n);
	int64_t* seq3 = (int64_t *)malloc(sizeof(int64_t)*n);
	while(true)
	{
		scanf("%s %d %d",str,&begin,&iter);
		if(strstr("seq1",str))
		{
			masbegin[0] = begin;
			masiter[0] = iter;
			for(int i=0;i<n;i++)
			{
				if(i==0)
					seq1[0] = masbegin[0];
				else
					seq1[i] = seq1[i-1]+masiter[0];
				printf("%d ",seq1[i]);
			}			
			//printf("%s %d %d\n",str,begin,iter);
			printf("\n");	
		}		
		if(strstr("seq2",str))
		{
			masbegin[1] = begin;
			masiter[1] = iter;
			for(int i=0;i<n;i++)
			{
				if(i==0)
					seq2[0] = masbegin[1];
				else
					seq2[i] = seq2[i-1]+masiter[1];
				printf("%d ",seq2[i]);
			}			
			//printf("%s %d %d\n",str,begin,iter);	
			printf("\n");
		}		
		if(strstr("seq3",str))
		{
			masbegin[2] = begin;
			masiter[2] = iter;
			for(int i=0;i<n;i++)
			{
				if(i==0)
					seq3[0] = masbegin[2];
				else
					seq3[i] = seq3[i-1]+masiter[2];
				printf("%d ",seq3[i]);
			}			
			//printf("%s %d %d\n",str,begin,iter);	
			printf("\n");		
		}	
		if(strstr("export seq",str))
		{
		}	
	}
	free(masiter);
	free(masbegin);
	free(str);
	free(seq1);
	free(seq2);
	free(seq3);
}

Gremlin_
() автор топика
Ответ на: комментарий от Gremlin_

Замени strstr на strnstr.

scan %d не даст тебе int64_t, он меньше. PRId64 посмотри.

зачем тебе masbegin в хипе? их вполне можно на стеке локально держать.

Все просто, берешь socket для создания сокета, потом делаешь bind, чтобы проассоциировать файловый дескриптор с нужным интерфейсом/портом, потом вызываешь listen, чтобы ядро начало слушать порт. Дальше уже по своему усмотрению, можешь однопоточно accept вызывать, можешь добавить SO_REUSEPORT и делать accept внутри нескольких тредов, а дальше сокеты передавать в корутины.

xpahos ★★★★★
()
Последнее исправление: xpahos (всего исправлений: 1)
Ответ на: комментарий от Gremlin_

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

crutch_master ★★★★★
()
Ответ на: комментарий от Gremlin_

я бы сделал асинхронщину на select/poll, с каждым коннектом своя структура в которой задана текущая позиция в последовательности. Как появляется возможность писать - писать следующий элемент.

OxiD ★★★★
()
Ответ на: комментарий от anonymous2
Вот код и задание 
http://www.cyberforum.ru/c-linux/thread2241745.html
я использую так:
Что-то не робит 
1. Собрал программу gcc main.c -levent 
2. под рутом стартанул программу ./a.out 127.0.0.1 23 
3. в другом терминале ввел telnet 127.0.0.1
и получил 
Trying 127.0.0.1... 
Connected to 127.0.0.1. 
Escape character is '^]'. 
Connection closed by foreign host. 
4. а в первом серверном терминале 
[0x557fcc83bac0] New connection! fd = 7 
[0x557fcc83bac0] on_read called, fd = 7
[0x557fcc83bac0] client sent a very long string, closing connection. 
[0x557fcc83bac0] on_close called, fd = 7 в чем ошибка?
Gremlin_
() автор топика
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.