Доброе утро! Столкнулся с проблемой: через отладчик gdb посмотрел,что функция recv получает данные и далее снова в ожидании получения данных,в то время как send уже передал данные и завершил работу. Возможно, что-то упустил ...
Куски кода: Server.c
int sendall(int s, char *buf, int len, int flags)
{
int total = 0;
int n = 0;
while(total < len)
{
n = (int) send(s, buf+total, (size_t) (len-total), flags);
if(n == -1) break;
total += n;
}
return (n==-1 ? -1 : total);
}
//Если вместо sendall использовать send - проблема актуальна.
int fileTransferSend(int sock, char pathToFile[]){
FILE *f;
if (!(f = fopen(pathToFile, "rb"))) {
perror("fopen");
return 1;
}
fseek(f, 0, SEEK_END);
int fsize = (int) ftell(f);
rewind(f);
char buffer[BUF_SIZE];
long sended = 0, readed = 0;
do {
readed = fread(buffer, 1, BUF_SIZE, f);
if ((sendall(sock, buffer, (int) readed, 0)) < 0) {
perror("send[7]");
}
sended += readed;
} while (sended != fsize);
fclose(f);
return 0;
}
Client.c
int fileTransferRecv(int sock){
char buffer[BUF_SIZE];
long rcv_len = 0;
memset(buffer, 0, sizeof buffer);
FILE *f;
if (!(f = fopen(pathToList, "wb+"))) {
perror("fopen");
return 1;
}
do {
rcv_len = recv(sock, buffer, BUF_SIZE, 0);
fwrite(buffer, 1, (size_t) rcv_len, f);
} while (rcv_len != 0);
fclose(f);
return 0;
}