ненавижу С. Зато его функциональным возможностям может позавидовать любой другой язык программирования!
но вот писать на нем клиент-сервер просто офигенно!
народ,подскажите плз,как сделать следующую вещь:
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. и не отправляет данные клиенту (или отправляет,но клиент их не получает..скорее второе :))
Потом я попорциям собирался отправлять клиенту реультаты моих действий.но клиент,этакий …, отрубается недождавшись.
Вообщем очень бы хотелось,чтобы знающие люби объяснили что и как делать!
Принимается любая помощь,в том числе из разряда «Эврика! но надо додумать!»
поэтому пасибо всем,кто примент участие в помощи!
пока.
Последние комментарии
-
OlegL, 17 декабря в 15:00 → Перекличка 21
-
REDkiy, 8 июня 2023 года в 9:09 → Как «замокать» файл для юниттеста в Python? 2
-
fhunter, 29 ноября 2022 года в 2:09 → Проблема с NO_PUBKEY: как получить GPG-ключ и добавить его в базу apt? 6
-
Иванн, 9 апреля 2022 года в 8:31 → Ассоциация РАСПО провела первое учредительное собрание 1
-
Kiri11.ADV1, 7 марта 2021 года в 12:01 → Логи catalina.out в TomCat 9 в формате JSON 1
![ecobeing ecobeing](/uploads/ad/image/d543f002e66d5f1767eb81016544b976336e76e5.png)
Предлагаю такой вариант
Кусок кода клиента
И кусок кода сервера который все считает
Не проверял но должно работать такая конструкция что бы не заморачиватся с файлами.
P.S Можно считать не только регулярный файлы но и другие
смотри в sys/stat.h
ну если быть уже до самого конца корректным,то ндо бюыло определить 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 — одинаковый результат.
бужу блгодрен опять же за любую помощь,в том числе из раздела «додумать надо :)»
спасибо.
<font color=«green»>find /some/path -type f|wc -l</font> — уже не работает? ;)
ну а вообще, if((d=opendir(dirname))==NULL) имеет несколько больше одного значения… например — недостаточно прав для переода в поддиректорию. и т.д.
Если это в текущей директории то попробуй скормить ему
не ./test а test или полностью путь.
или через strace наверное можно посмотреть