nixp.ru v3.0

23 октября 2017,
понедельник,
16:30:55 MSK

DevOps с компанией «Флант»
zi007 написал 25 декабря 2006 года в 10:36 (568 просмотров) Ведет себя неопределенно; открыл 2 темы в форуме, оставил 2 комментария на сайте.

ненавижу С. Зато его функциональным возможностям может позавидовать любой другой язык программирования!

но вот писать на нем клиент-сервер просто офигенно!

народ,подскажите плз,как сделать следующую вещь:

1.клиент передает серверу информацю о всех поддиректориях текущего каталога:

я это делаю так:

1. ls -la| grep 'dr’|cut -c 46- >Log.txt

2. читаю из Log.txt в локальный сокет (AF_UNIX)

2. Сервер должен подсчитать количество файлов в переднных ему подкаталогах.

и эту информацию передать клиенту,а клиент должен ее уже вывести:

в голову пришла только вот такая мысль:

while(1)

{

do

{

memset(buf,0,10);

len_buf=recv(client_socket,buf,10,0);

write(fp,buf,len_buf);

printf(«len_buf=%d\n»,len_buf);

}

while(len_buf==10);

close(fp);

memset(buf,0,sizeof(buf_dir));

p=fopen(«log.txt»,«r»);

nbytes=fread(buf,sizeof(char),10,p);

i=0;

while(nbytes==10)

{

for( k=0;k

{

if(buf[k]!=’\n’)

{

name_dir=buf[k];

i++;

}

else

{

if(status>1)

{

printf(«%c»,buf_dir[0]);

printf(«STATUS=%d\n»,status);

char*text=(char*)calloc(34+i,sizeof(char));

text=strcat(text,head);

printf(«text_system1=%s\n»,text);

text=strcat(text,name_dir);

printf(«text_system2=%s\n»,text);

text=strcat(text,end);

printf(«text_system3=%s»,text);

system(text);

system(«wc -l dir_name.txt >l.txt»);

free(text);

t_ptr=fopen(«l.txt»,«r»);

do

{

memset(name_dir,0,10);

nbytes1=fread(name_dir,sizeof(char),10,p);

send(client_socket,name_dir,nbytes1,0);

}

while(nbytes1==10);

fclose(t_ptr);

}

status++;

i=0;

printf(«\nEND ITERATION %d\n»,status-1);

}

}

nbytes=fread(buf,sizeof(char),10,p);

}

fclose(p);

return 0;

}

Единственная проблема — он не дочитывает файл до конца, а просто оставляет последнюю строчку непрочитанной,при этом нагло меня обманыввая и говоря,то nbytes=0. и не отправляет данные клиенту (или отправляет,но клиент их не получает..скорее второе :))

Потом я попорциям собирался отправлять клиенту реультаты моих действий.но клиент,этакий …, отрубается недождавшись.

Вообщем очень бы хотелось,чтобы знающие люби объяснили что и как делать!

Принимается любая помощь,в том числе из разряда «Эврика! но надо додумать!»

поэтому пасибо всем,кто примент участие в помощи!

пока.

Steck

Предлагаю такой вариант

Кусок кода клиента

DIR *dir;
struct dirent *dp;
struct stat info;
char *dirname; // Директория в которой есть поддиректории в который надо считать файлы
stat(dirname,&info);
if(S_ISDIR(info.st_mode)){
dir = opendir(dirname);
while((dp = readdir(dir)) != NULL)
{
stat(dp->d_name,&info);
if(S_ISDIR(info.st_mode))
ПИШЕМ_В_СОКЕТ(dp->d_name);
printf(ЧИТАЕМ_ОТВЕТ(СОКЕТ));
}
}
printf("error: dir!\n");
}

И кусок кода сервера который все считает

ФУНКЦИЯ_СЧИТАЛКА(char *dirname){
DIR *dir;
struct dirent *dp;
struct stat info;
int i=0;
char *tmp[256];
dir = opendir(dirname);
while((dp = readdir(dir)) != NULL)
{
stat(dp->d_name,&info);
if(S_ISREG(info.st_mode))
i++;
}
sprintf(tmp,"DIR %s - Files %d",dinrame,i);
ПИШЕМ_В_СОКЕТ_КЛИЕНТУ(tmp);

Не проверял но должно работать такая конструкция что бы не заморачиватся с файлами.

P.S Можно считать не только регулярный файлы но и другие

смотри в sys/stat.h

zi007

ну если быть уже до самого конца корректным,то ндо бюыло определить struct stat info как:

struct stat*info

А тк большое спсибо.

реально помогло избавиться от возни с файлами :)

остлась или…скорее появилась новая заковырка:(

вот кусок кода сервера:

while(nbytes==1)

{

if(l[0]==' ')

{

char*pdir=(char*)calloc(strlen(dirname)+2,sizeof(char));

pdir=strcat(pdir,«./»);

printf(«ok strcat1\n»);

pdir=strcat(pdir,dirname);

printf(«dir=%s\n»,dirname);

printf(«OK BEFORE OPEN DIR»);

if((d=opendir(dirname))==NULL)

{

printf(«ERROR\n»);

exit(1);

}

printf(«OK OPENDIR»);

while((dp=readdir(d)) != NULL)

{

stat(dp->d_name,info);

if(S_ISREG(info->st_mode))

{

count++;

}

}

closedir(d);

write(fd2,dirname,strlen(dirname));

write(fd2,&count,sizeof(int));

h=0;

memset(dirname,0,30);

free(pdir);

count=0;

}

else

{

dirname[h]=l[0];

h++;

}

nbytes=read(fd,l,1);

}

Так вот: эта вещь все нормально прописывает имя нужной поддиректории (как ./test) и вот тут

if((d=opendir(dirname))==NULL)

{

printf(«ERROR\n»);

exit(1);

}

происходит выход,т.е. она не хоет или не может открыть поток директории.

тестил под freebsd CentOS — одинаковый результат.

бужу блгодрен опять же за любую помощь,в том числе из раздела «додумать надо :)»

спасибо.

Genie

<font color=«green»>find /some/path -type f|wc -l</font> — уже не работает? ;)

ну а вообще, if((d=opendir(dirname))==NULL) имеет несколько больше одного значения… например — недостаточно прав для переода в поддиректорию. и т.д.

Steck

Если это в текущей директории то попробуй скормить ему

не ./test а test или полностью путь.

или через strace наверное можно посмотреть