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

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

Вернуться   Форум программистов > IT форум > Помощь студентам
Регистрация

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 04.06.2013, 13:00   #1
canela
Новичок
Джуниор
 
Регистрация: 04.06.2013
Сообщений: 1
По умолчанию Клиент запрашивает список файлов в текущем каталоге сервера

Есть текст программы.Можно переделать несколько строк, чтобы получилась программа "клиент запрашивает список файлов в текущем каталоге сервера"? Если да, то что нужно писать? Если нет, то условия на задачу:
требует реализации двух программ -клиента и сервера (либо единой программы, которая может выступать либо в роли клиента, либо в роли сервера). Сервер ждет подсоединения от любого удаленного клиента, клиент инициирует соединение с удаленным сервером. Номер порта является параметром как сервера, так и клиента.

Текст программы:
client.c
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <unistd.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <netdb.h>
static void usage(void);
int main(int argc,char *argv[]){
struct sockaddr_in peeraddr;
struct hostent *host;
short peerPort;
int res;int F;
char buffer[1024];
const char *peerhost = "localhost";
int s0=socket(AF_INET,SOCK_STREAM,0);
if(argc>1 && *(argv[1])=='-'){
usage(); //выдать справку
exit(1);
}

if(s0<0){
perror("Can't create a socket");
exit(1);
}
memset(&peeraddr,0,sizeof(peeraddr) );
host = gethostbyname(peerhost);
if(argc>1) peerhost=argv[1];

if(host==NULL){
perror("Can't define hostaddress");
exit(1);
}
peeraddr.sin_family = AF_INET;
peerPort=1234;
if(argc>=3) peerPort = (short) atoi(argv[2]);
peeraddr.sin_port = htons(peerPort);
printf("peeaddr = %d%d%d%d, port %d\n",
host->h_addr_list[0][0]&0xff,
host->h_addr_list[0][1]&0xff,
host->h_addr_list[0][2]&0xff,
host->h_addr_list[0][3]&0xff,
(int)peerPort);
memmove(&peeraddr.sin_addr.s_addr,h ost->h_addr_list[0],4);
res=connect(s0,(struct sockaddr*)&peeraddr,sizeof(peeraddr ));
if(res<0){
perror("Can't connect");
exit(1);
}
printf("Connected.Reading a server message \n");
//
res=read(s0,buffer,1024);
if(res<0){
perror("Read error");
exit(1);
}
printf("Ressived:\n%s",buffer);
write(s0,"Thanks.Bye-bye\r\n",20);
//
close(s0);
return 0;
}
static void usage(void){
printf("usage./client[IP_address_of_server[port_of_server]]\n");
}

server.c:
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <unistd.h>
#include <sys/socket.h>
#include <netinet/in.h>

static void usage(void);
int main(int argc,char *argv[]){
int listenPort; int s0; int res;int s1;int F;
struct sockaddr_in myaddr;// структура, описывающая сокет для работы с протоколами ип
struct linger linger_opt={1,0};//структура, сохраняющая информацию о конкретном сокете
struct sockaddr_in peeraddr;//описывает сокет, сюда записывается инф о клиенте
char buffer[1024]; //решили что такая макс длина будет у буфера
socken_t peeraddr_len;//длина стуктуры адреса сокета
if(argc>1 && *(argv[1])=='_'){
usage(); //выдать справку
exit(1);
}
listenPort=1234;
if(argc>1) listenPort=atoi(argv[1]); //если имя хоста задано
s0=socket(AF_INET,SOCK_STREAM,0);//создали сокет, получили его дискриптор
if(s0<0){
perror("Can't create a socket");
exit(1);
}
memset(&myaddr,0,sizeof(struct sock addr_in)); //заполнить чтото одинаковыми байтами
myraddr.sin_family = AF_INET; //создалиструктуру для записи в сокет, создали сокет, далее если незадано имя сокета одно, если задано - другое
myaddr.sin_port = htons(listenPort); //номер порта записываем в структуру h - host, to, n - network, s - short
//числа передаются в другомвиде, нежели они хранятся в компе(сначала старший бит, потом младший)
myaddr.sin_addr.s_addr = htonl(INADDR_ANY); //ковертирует 32-битную беззнаковую величину из локального порядка байтов в сетевой
res=bind(s0,(struct sockaddr*)&myaddr,sizeof(myaddr)); //теперь соединяемся с сервером, последнее - размер структуры
if(res<0){
perror("Can't bind a socket");
exit(1);
}
setsockopt(s0, SOL_SOCKET,SO_LINGER,&linger_opt, sizeof(linger_opt));//установили флаги на сокете 2-уровень, где находится флаг
res=listen(s0,1);//прослушивает соединения на сокете
if(res<0){
perror("listen error");
exit(1);
}
peeraddr_len=sizeof(peeraddr);
s1=accept((s0,struct sockaddr*)&peeraddr,&peeraddr_len);//с0 слушает всех, с1 для конкретного клиента
if(s1<0){
perror("acception error");
exit(1);
}
printf("Connection from IP %d.%d.%d.%d, Port %d\n",(ntohl(peeraddr.sin_addr)>>24 )&Oxff, (ntohl(peeraddr.sin_addr)>>16)&Oxff , (ntohl(peeraddr.sin_addr)>>8)&Oxff, (ntohl(peeraddr.sin_addr)>>0)&Oxff, (ntohl(peeraddr.sin_port));
res=close(s0);
//откуда примерно мне сказали, надо менять
write(s1,"Hello!\n",8);
res=read(s1,buffer,1023);
if(res<0){
perror("Read error");
exit(1);
}
buffer[res]=0;
printf("Received %d bytes:\n%s",res, buffer);
//
close(s1);
return 0;
}.
static void usage(void){
printf("usage:\n server [port]\n");
}
canela вне форума Ответить с цитированием
Ответ


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Как загрузить в Мemo список файлов в каталоге g00dhash Общие вопросы Delphi 7 23.01.2015 10:32
Список файлов и папок в каталоге Evgenuych96 Паскаль, Turbo Pascal, PascalABC.NET 7 27.10.2012 14:07
Поиск файлов в каталоге pupilMartyr Win Api 12 06.12.2011 00:16
Переименование всех файлов в каталоге calugin PHP 3 14.05.2011 12:05
Создать файл текущем каталоге tarakan1983 Помощь студентам 6 14.09.2008 21:59