|
|
Регистрация Восстановить пароль |
Повторная активизация e-mail |
Регистрация | Задать вопрос |
Заплачу за решение |
Новые сообщения |
Сообщения за день |
Расширенный поиск |
Правила |
Всё прочитано |
|
Опции темы | Поиск в этой теме |
04.06.2013, 13:00 | #1 |
Новичок
Джуниор
Регистрация: 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"); } |
Похожие темы | ||||
Тема | Автор | Раздел | Ответов | Последнее сообщение |
Как загрузить в М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 |