Я написал простое tcp/ip
соединение client-server
в c++
.C++ читать неизвестный объем данных из сокета
Это часть сервера, который обрабатывает соединительном
int sockfd, newsockfd;
socklen_t clilen;
struct sockaddr_in serv_addr, cli_addr;
int n = 0;
sockfd = socket(AF_INET,SOCK_STREAM,0);
if(sockfd < 0){
cout << "Error opening socket" << endl;
exit(1);
}
bzero((char*)&serv_addr, sizeof(serv_addr));
serv_addr.sin_family = AF_INET;
serv_addr.sin_addr.s_addr = INADDR_ANY;
serv_addr.sin_port = htons(portno);
if(bind(sockfd,(struct sockaddr *) &serv_addr,sizeof(serv_addr))<0){
cout << "Error binding" << endl;
exit(1);
}
listen(sockfd,1);
clilen = sizeof(cli_addr);
newsockfd = accept(sockfd,(struct sockaddr *)&cli_addr, &clilen);
if(newsockfd < 0){
cout << "Error accepting" << endl;
exit(1);
}
bzero(bytes,size_tot);
uint64_t total_bytes_read = 0;
uint64_t total_bytes_to_read = size_tot;
while(total_bytes_read < total_bytes_to_read){
int bytes_read = read(newsockfd,bytes + total_bytes_read,total_bytes_to_read - total_bytes_read);
if(bytes_read == -1){
cout << "error reading "<< endl;
n = -1;
break;
}
total_bytes_read += bytes_read;
}
, но это работает, если я знаю, что общее количество байтов для чтения. Что делать, если общий объем данных для чтения неизвестен? Как я могу изменить этот кусок кода?
Похоже, что этот вопрос неоднозначен, и это приводит к противоречивым ответам. Не совсем понятно, что вы хотите прочитать. Вы хотите прочитать все байты, пока другая сторона не закроет соединение? Или что? –
Я считаю, что вопрос совершенно ясен, и OP спрашивает, как вообще иметь дело с случаем, когда размер передачи неизвестен заранее. – SergeyA
Тогда мой ответ был точно верным. Вы просто вызываете 'read' без цикла, ожидающего определенного количества байтов. (Его вопрос заключался в том, как модифицировать код приема на низком уровне, а не как писать код протокола высокого уровня.) –