Здравствуйте! Пишу для себя написать музыкальный сервис с разными функциями работы. И при выполнении возникла проблема,помогите пожалуйста исправить.
Ситуация такая:у меня есть server.c и в этом каталоге есть папка music,где хранятся песни и хочу при подключении к серверу клиента,передать ему все содержимое каталога music т.е. имена песен ....mp3.
При подключении к серверу клиента,на сервере выводятся имена всех песен.(.\nmusic1.mp3\nmusic2.m\n...)После я хочу их передать клиенту и тут проблема,у клиента на экран выводится только ".". и после выводится дальше по коду,привет я муз.сервис и после вывода клиент висит.
Также по возможности прошу подсказать что стоит изменить или как лучше написать по всему коду т.к. пишу первый раз и скорее всего много багов или еще чего.
Листинг Сервера:
#include <sys/types.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <dirent.h>
#define BUF_SIZE 4096
int main(int argc, char **argv)
{
int sock, listener; // дескрипторы сокетов
struct sockaddr_in addr; // структура с адресом
char buf[2048]; // буфур для приема
int bytes_read; // кол-во принятых байт
listener = socket(AF_INET, SOCK_STREAM, 0); // создаем сокет для входных подключений
if(listener < 0)
{
perror("socket");
exit(1);
}
// Указываем параметры сервера
addr.sin_family = AF_INET;
addr.sin_port = htons(3425);
addr.sin_addr.s_addr=inet_addr("127.0.0.1");
if(bind(listener, (struct sockaddr *)&addr, sizeof(addr)) < 0) // связываемся с сетевым устройство. Сейчас это устройство lo - "петля", которое используется для отладки сетевых приложений
{
perror("bind");
exit(2);
}
listen(listener, 1); // очередь входных подключений
while(1)
{
sock = accept(listener, NULL, NULL); // принимаем входные подключение и создаем отделный сокет для каждого нового подключившегося клиента
if(sock < 0)
{
perror("Прием входящих подключений");
exit(3);
}
switch(fork())
{
case -1:
perror("fork");
break;
case 0:
close(listener);
/////////
DIR *dfd;
struct dirent *dp;
char filename[NAME_MAX];
if(argc < 2){strcpy(filename,"music");}
else{printf("error");exit(4);}
dfd=opendir(filename);
char readeds = 0;
char buffers[BUF_SIZE];
char* str;
while((dp=readdir(dfd))!= NULL){
str=dp->d_name;
printf("%s\n",str);
send(sock,str,sizeof(str),0);
}
//send(sock,str,sizeof(str),0);
str=0;
send(sock,str,sizeof(str),0);
closedir(dfd);
//char str[]="hello worlds";
//send(sock,str,sizeof(str),0);
/////////
printf("Едем дальше...");
char text[]="Привет,Я музыкальный сервис!Вот мои композиции[1-6]:1)Safe And Sound;2)Papaoutai;3)We Own It;4)WWE-SHIELD;5)d.ramirez;6)Звуки природы";
char buftext[sizeof(text)];
send(sock,text,sizeof(text),0);
bytes_read = recv(sock, buf, 2048, 0); // принимаем сообщение от клиента
if(bytes_read <= 0) {break;}
printf("Клиент скачал композицию под номером: %s\n",buf);
FILE* f;
int x=atoi(buf);
switch(x){
case 1:
f = fopen("1.mp3","rb");
break;
case 2:
f = fopen("2.mp3","rb");
break;
case 3:
f = fopen("3.mp3","rb");
break;
case 4:
f = fopen("4.mp3","rb");
break;
case 5:
f = fopen("5.mp3","rb");
break;
case 6:
f = fopen("6.mp3","rb");
break;
}
fseek (f , 0 , SEEK_END);//устан.указатель текущей позиции файла (seek_end - поиск с конца файла).Если =0 -ошибка.
int fsize = ftell (f);//если ошибка: -1.ftell() считывает текущее значение указателя позиции файла.
rewind (f);
long sended = 0;
long readed = 0;
char buffer[BUF_SIZE];
do{
readed = fread (buffer,1,BUF_SIZE,f);//считывание данных в память.
send(sock, buffer, readed, 0);
sended += readed;
}while(sended != fsize );
close(f);
close(sock); // закрываем сокет
_exit(0);
default:
close(sock);
}
}
close(listener);
exit(0);
}
#include <sys/types.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <stdio.h>
#include <stdlib.h>
#include <time.h>
#define BUF_SIZE 4096
int main (int argc, char **argv)
{
char message[2048];
char buf[sizeof(message)];
int port,ch;
if(argc!=3){
printf("Не верное кол-во аргументов!\nДолжно быть 2 аргумента (Порт,ip-адрес -сервера)!\n");
exit(0);
}
int sock; // дескриптор сокета
struct sockaddr_in addr; // структура с адресом
struct hostent* hostinfo;
port = atoi(argv[1]);
hostinfo = argv[2];
sock = socket(AF_INET, SOCK_STREAM, 0); // создание TCP-сокета
if(sock < 0)
{
perror("socket");
exit(1);
}
// Указываем параметры сервера
addr.sin_family = AF_INET; // домены Internet
addr.sin_port = htons(port); // или любой другой порт...
addr.sin_addr.s_addr=inet_addr(hostinfo);
if(connect(sock, (struct sockaddr *)&addr, sizeof(addr)) < 0) // установка соединения с сервером
{
perror("Подключение");
exit(2);
}
////////////////
char buffers[BUF_SIZE];
char rcv_lens = 0;
char str[BUF_SIZE];
do{
rcv_lens=recv(sock, str, BUF_SIZE, 0);
printf("%s\n",str);
if (!strcmp(str), 0){break;}
} while(rcv_lens != NULL);
//char str[BUF_SIZE];
//recv(sock, str, BUF_SIZE, 0);
//printf("%s",str);
////////////////
char buftext[1024];
int bytes_read=recv(sock,buftext,1024,0);
printf("Принятое сообщение от сервера: %s/n",buftext);
printf("Введите номер композиции(Для выхода:exit): ");
if (!strcmp(gets(message), "exit")){close(sock);return 0;}
send(sock, message, sizeof(message), 0); // отправка сообщения на сервер
FILE* f = fopen("music.mp3","wb");
char buffer[BUF_SIZE];
long rcv_len = 0;
do{
rcv_len = recv(sock, buffer, BUF_SIZE, 0);
fwrite (buffer,1,rcv_len,f);//считываем из памяти в файл
} while(rcv_len != 0);
fclose(f);
close(sock);
return 0;
}