Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > C/C++ программирование > C/C++ Сетевое программирование
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 02.09.2013, 22:21   #31
waleri
Старожил
 
Регистрация: 13.07.2012
Сообщений: 6,493
По умолчанию

system() может перенаправить только из/в файл...
waleri вне форума Ответить с цитированием
Старый 02.09.2013, 22:28   #32
Кащей
Форумчанин
 
Аватар для Кащей
 
Регистрация: 09.07.2013
Сообщений: 249
По умолчанию

Цитата:
system() может перенаправить только из/в файл...
Следовательно надо пользовать ето:
Цитата:
Если CreatePipe() тогда еще DuplicateHandle() и CreateProcess()
??
do not use your brain
Кащей вне форума Ответить с цитированием
Старый 03.09.2013, 12:34   #33
Кащей
Форумчанин
 
Аватар для Кащей
 
Регистрация: 09.07.2013
Сообщений: 249
По умолчанию

продолжаю тему использования пайпов и dub2, спасибо за ето вот етому asmprog большеголовому человеку.
Что было написано:
Код:
#include <string.h>
#include <stdlib.h>
#include <stdio.h>
#include <unistd.h>
#include <sys/types.h>
#include <sys/wait.h>

int main(void)
{
	char	str[] = "Hello, CGI!";
	char	rstr[80];
	
	int status;
	
	int pfd[2];
		pipe(pfd);
		
	pid_t   cp;
		cp = fork();
		if(cp == 0){
			close(pfd[0]);
			dup2(fileno(stdout), pfd[1]);
			execl("http сервер/cgi/index", "http сервер/cgi/index", str, NULL);
		}
		else if(wait(&status) != -1 && WIFEXITED(status)){
			printf("read bytes: %d\n", read(pfd[1], rstr, sizeof(rstr)));
			printf("Server received string: %s", rstr);
		}
		close(pfd[1]);
				
	return(0);
}
Код:
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <unistd.h>

int main(int argc, char **argv)
{
		char	wstr[] = "Hello server!";
		printf("CGI received string: %s\n", argv[1]);
		printf("CGI writed string: %s\n", wstr);
		
	return 0;
}
Что не работает - обратная связь. Тоесть в stdin записать получается и с форками и без, а вот считать из stdout - нет. Что делает первый код - создаёт дескрипторы(я не уверен что ето надо внутри fork-нутого процесса), разветвляет процесс, замещает потомка запускаемой программой, ждёт её завершения и пытается считать данные из stdout.
В чём причина и как это лечится?
do not use your brain

Последний раз редактировалось Кащей; 03.09.2013 в 19:14.
Кащей вне форума Ответить с цитированием
Старый 03.09.2013, 19:13   #34
Кащей
Форумчанин
 
Аватар для Кащей
 
Регистрация: 09.07.2013
Сообщений: 249
По умолчанию

Свершилось, наконец я понял как работает ета фигня. Ошибка была в том, что нужно подменить stdout в потомке и принимать из stdin в главном процессе. А я дурак пол дня мурыжил и подозревал, подозревал и всёравно мурыжил.
Код:
#include <string.h>
#include <stdlib.h>
#include <stdio.h>
#include <unistd.h>
#include <sys/types.h>
#include <sys/wait.h>

int main(void)
{
	char	str[] = "Hello, CGI!";
	
	int pfd[2];
		pipe(pfd);
	
	int status;
	pid_t   cp;
		cp = fork();
		if(cp == 0){
			close(fileno(stdin));
			dup2(pfd[1], fileno(stdout));
			execl("http сервер/cgi/index", "http сервер/cgi/index", str, NULL);
		}
		else if(wait(&status) != -1 && WIFEXITED(status)){
			char rstr[255];
				memset(rstr, 0, 255);
				close(pfd[1]);
				printf("Receive number: %ld\n", read(pfd[0], rstr, 255));
				printf("Server received string: %s", rstr);
				close(pfd[0]);
		}
		
	return(0);
}
do not use your brain
Кащей вне форума Ответить с цитированием
Старый 03.09.2013, 20:53   #35
Кащей
Форумчанин
 
Аватар для Кащей
 
Регистрация: 09.07.2013
Сообщений: 249
По умолчанию

замечания, заявления, предложения?
do not use your brain
Кащей вне форума Ответить с цитированием
Старый 10.09.2013, 18:37   #36
Кащей
Форумчанин
 
Аватар для Кащей
 
Регистрация: 09.07.2013
Сообщений: 249
По умолчанию

Значит, делюсь результатом с теми кому лень гуглить. сия бурда работает и может быть не у всех будет работать без последствий, но я ни на чём кроме ubuntы не испытывал. переменные окружения я использовать не стал, пример как это делается в этой теме гдето, также не передаю я CGI программе ничего, но ето херня.

Компилируем стандартными методами в один каталог, запускаем сервер и обращаемся к http://127.0.0.1:8080/CGI_name.

Исходник CGI сервера:
Код:
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <unistd.h>
#include <sys/types.h>
#include <sys/wait.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <arpa/inet.h>

typedef unsigned char byte;
/*Собственно http сервер*/
void request_handler(int cFD, int port){
	char	buf[4096];
		memset(buf, 0, 4096);
		recv(cFD, buf, 4096, 0);
		
	char path[4096], method[16], protocol[16];
		sscanf(buf, "%s /%s %s\n", method, path, protocol);//Получаем путь к cgi
			
	int pfd[2];
		pipe(pfd);
		
	pid_t cp = fork();//это было нарыто в интернете, почему именно это - гуглим.
		if(cp == 0){
			close(pfd[0]);
			dup2(pfd[1], fileno(stdout));//подменяем вывод на наш дескриптор
			if(access(path, 00) == 0)
				execl(path, path, NULL);//и запускаем CGI
			else exit(0);
		}
		else{
			int status;
				if(wait(&status) != -1 && WIFEXITED(status)){//ждём завершения работы CGI
					close(pfd[1]);
					memset(buf, 0, 4096);//очищаем буфер
					while(read(pfd[0], buf, 4096) > 0) send(cFD, buf, 4096, 0);//заполняем его выводом CGI программы и отправляем
					close(pfd[0]);					
				}
		}
}
/*функция создаёт TCP сервер*/
typedef void callback(int, int);

void tcp_server(int port, int turn, callback* fp){
	struct sockaddr_in addr;
		memset(&addr, 0, sizeof(addr));
		addr.sin_family = PF_INET;
		addr.sin_port = htons(port);
		addr.sin_addr.s_addr = htonl(INADDR_ANY);
		
	int sFD, bnd, lstn;
	/* так как меня забодало ждать пока сокет отойдёт после закрытия программы,
	 * постоянно тыкая запуск сервера, я решил зациклить запуск сервера*/
	for(;;){
		if((sFD = socket(PF_INET, SOCK_STREAM, IPPROTO_TCP)) != -1){
			if((bnd = bind(sFD,(struct sockaddr*)&addr, sizeof(addr))) != -1){
				if((lstn = listen(sFD, turn)) != -1){
					puts("**THE SERVER IS RUNNING");
					for(;;){
						int cFD = accept(sFD, 0, 0);
						if(cFD >= 0){
							fp(cFD, port);//При получении данных, запускается функция имитирующая http сервер.
							shutdown(cFD, SHUT_RDWR);
							close(cFD);
						}
					}
				}
			}
		}
		close(sFD);
		sleep(1);
	}
}

int main(int argc, char* argv[]){
	int port = 0, turn = 0;//номер порта и размер очереди
	if(argc == 3){
		if(!sscanf(argv[1], "%d", &port	))	return -1;
		if(!sscanf(argv[2], "%d", &turn))	return -1;
		tcp_server(port, turn, &request_handler);
	}else printf("NO MORE PARAMETERS\n");
	
	return 0;
}
Ну и пример CGI программы:
Код:
#include <stdio.h>
int main(void){
		puts("HTTP/1.1 200 OK\nServer: free hands/0.0.0\nContent-Type:text/html\n\n");//Обязательный заголовок самодостаточной CGI, формирующей полный ответ(тоесть часть ответа - левую, должен был бы формировать сервер)
		puts("<!DOCTYPE html><html lang = ru><body><h1>Hello CGI!</h1><hr></body></html>");

	return 0;
}
do not use your brain

Последний раз редактировалось Кащей; 10.09.2013 в 18:41.
Кащей вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
HTTP Сервер Dkey Помощь студентам 1 01.07.2012 08:25
http server,http сервер, проблемы с post реализация на java snajper_ro Общие вопросы по Java, Java SE, Kotlin 1 23.10.2011 14:25
http-сервер LimanSSk Свободное общение 1 02.03.2009 15:16
http сервер mar4elo Работа с сетью в Delphi 6 12.01.2009 13:11
создание cgi для сохранения на сервере exe файла преданного через http L0rD Работа с сетью в Delphi 2 22.06.2007 12:52