Перейти к содержанию

Сетевое приложение.


Рекомендуемые сообщения

Собственно пишу программку примерно такого характера.

Есть одна прога которя слушает опредеоенный порт и при попытке подключения по этому порту запускает другую программку которая уже будет обслуживать клиента.

Вот функция запуска другой проги:

bool start_connect(char* file, char* ip, char* sock){

int i = fork();

if( i == 0 ){

if( execl(file, file, ip, sock, NULL) == -1 ){

perror("exec");

return false;

}

}

if(i < 0){

perror("fork");

return false;

}

return true;

}

Запуск собственно проходит нормально и работа с клиентом тоже, но вот когда я пытаюсь из запущенной проги закрыть соединение, то ничего не проходит Sad(покраней мере следующие дискрипторы так и продолжают рости) и клиент подключенный телнетом не отрубается, так же прога остается висеть в памяти пока я не пришибу ее родителя. Подскажите как бороться????

#include

#include "func.h"

#include

#include

#define PACH_TMP "tmp/"

int tmp_file(char* file_name){

FILE* F = fopen(file_name, "r");

if(F == NULL){

F = fopen(file_name, "w");

if(F == NULL){

perror(file_name);

return -1;

}else{

fclose(F);

return 0;

}

}else{

printf("Connect openned\n");

return 1;

}

}

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

if(argc != 3)return -1;

char *tmp = new char[strlen(PACH_TMP) + strlen(argv[1])];

strcpy(tmp, PACH_TMP);

strcat(tmp, argv[1]);

printf("%s\n", tmp);

int c_sock = str_to_int(argv[2]);

char buff[256];

if(tmp_file(tmp) == 0){

int r;

for(;;){

r = read(c_sock, buff, 255);

if(r == 0)break;

if(r < 0){

perror("Read socket");

close(c_sock);

remove(tmp);

return -1;

}

printf("%s\t%d\t%d\n", buff, r, c_sock);

}

remove(tmp);

delete [] tmp;

return -1;

}

printf("%d\n", c_sock);

printf("%d\n", close(c_sock));

};

Ссылка на комментарий
Поделиться на другие сайты

  • 2 недели спустя...

Как бороться спрашиваешь?... Главное не здаваться !!!

Но вот несколько ...ммм советов, что ли.

Во первых, чтобы чайлд окончательно издох парент должен waitpid() вызвать.

Во вторых, на счет дескрипторов, ты close() только у чайлда

вызываешь... он же не очищает таблицу дескрипторов парента, а надо чтобы парент close() вызвал... чайлду вообще не обязательно,

хотя, конечно, крайне желательно...

И в третьих, но не менее важно, нужно код форматировать, чтобы

посмотрел, и сразу все ясно.

Ссылка на комментарий
Поделиться на другие сайты

Присоединяйтесь к обсуждению

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

Гость
Ответить в этой теме...

×   Вставлено с форматированием.   Вставить как обычный текст

  Разрешено использовать не более 75 эмодзи.

×   Ваша ссылка была автоматически встроена.   Отображать как обычную ссылку

×   Ваш предыдущий контент был восстановлен.   Очистить редактор

×   Вы не можете вставлять изображения напрямую. Загружайте или вставляйте изображения по ссылке.

Загрузка...
×
×
  • Создать...